)0O@w70HPe5J{CtXAL1~(_smI@gM=D z@fa|I$5T??Sy 8AWzDRccs(|9Z4y8s??Rr}S@DbU8G$4h>p-bxuy2CYr^3 zn)BAr!ztD;BgHYT(~2~SMV}mu_7pCjAU xEv4Sdk5!=nl_VYK}#>y`D^)R zt*qH&uuLvHP^Wo#U9EPH?rH8}_ES#Mw3|hXDC~IwPmS>rRyaNqHCx3WJw;a54)S~S zMO jD3m6R?Ptr|>~m|QIOW9|Q}Jc@OldrnbozJ>+Sp5NAe-956F zqQG?tB{nmQ&Ku+`YwWDmDjM3A{?7-QH9ay7YlvczlA|yBGVG~P`ll #ZYH zTeFpToJ(SH{^~r7esW&l^D1TyAE6l|$iJ >^7`E@_Ex-)>9w>^C}-ER7U3yO>FHfbGf_$=V5pY(;yr7ay&AynIZpPD~dk zbY)DUNbfvPksjYV{^y QI&ku!Y~+VBlp#RrDQ_O G_5JkANlk)p;^;5dD3_>+mm`Q zb(f=>R$V5ax@%P+E088@+WBdzCo dgKL{>Th3B!bIZ8AtT4;t!+hSF@G(5siYBpX zZ-rU@8)14vE ptXk*qX5te^Vc$%lq^LBch$RaPu zCUI4XzJ;4HGHjis^fRn7{Xu%dv*^ilDLGTaOr9VXi=#}CDf&*ShA-kHAJtgID`&WB zDqwq*Y3e$q|I5L$zQQ8u?TiPU* 8!U!gW4YBUmghHucZOz8aUy>UqIF z>NwZN6^EGBsPrE?m+<%5!D7s$C;B*(t|iZd7lh-&EN%}s=Oy-+tZ{uz(lyg8;6G6M z1LrkpD;4`d%{R 3so3`|&O0*;QR(y&V z7<~`3DE%)E(s_YH?q6d$9=T_ci(-ww**!s=gq6zP|FKMKb@zZ~(zg7Y8Ld+m&ODhZ zJXV*P#+meDmyNdz;Vzcrk&MEOifV3_q2Q|slYSwvcL(LiT<2uLk|%ax{(L`jZQ6Ch z)oGg6Jy~1<3%AHO$eR2WkqN@MwCmD-kY&hUa?Ik >^Y)wKT% X?Q4&}K`qYr^9_ZA_S6SjEi{^8Xsy=OUfJz YT*ix1wInVq))r_Zyd}HLT+O2G1A?qElm9H*Ilzii!xoQ# z8d~&85-ruVBR)L9p++vA{r5s+L}ZMdUdSIKyahNdEFgF1fWdUn#1vU7dIha7dtbAM z6;(wv?fdG+;LI}agG$D? CosOerh)L`iQx!{ncxF^z2gGzaekrjel-msBhb;jmiX8{<3|{glrDnLs6= zd7v9WPS6I>Hc$)bQP3gK%b*D8B Y;L-RHO#(4(M3-RGze+_t?a13d~lv^Q49Wb}1%!6&SE??-9qw_v#Ml+gRY zDXw?tM lP39p?}~zeUOIh)?cvO!*9{x{FxT9 zZ|Rm;-smtlcXeR3Cu35kC%gK4)fzLCxw%G9c7W&E= 1AijU= zd+_|m86nz}F5cbE@CKx5DTVxPMab#Ca%@D?!E*QEJUHW|_8FYNMD~zX9F23uhXa%| ziRoqww9gG#PHweuVtX0wiQ^)7F~vOIragdpy( ;h-$&X}d z4`?4^yQa(OQ#9gpWfM^^ls_>d@YH&<5}Gob7s{TubCJ~CzsVMknR2y!t2xaYJ1=ZF z&v4e{+e_?SI4fy(J>J)xKQ=N7yYHy{KZbd6x(z*fhCHOc?trh%L|zbjV&MM1z4_@8 z#WImgF>f!+5;NwF5VLI>>_8#Q@44(UJaJ6hOE3duq6*!eHBLOEs2?+Ln}=O20|@OW!v0 zE_RPGA!_{VaI+Oy6_Xk+C*M &C2!WIiJ>$8f2>00?LP%oYRV0Z73 zU5#m^SS-I~9Ub%N^}%$LM*K-^tg=PJbk3Hk;Yvo7iSn 0R z?=(5ZtPxvd^}^V<#`Rt7yB0g%4mz)d^?kj6lwxmblY3tAaR*m=B%W(Fi27o_StA(( zdhy8SEOB)JXWT)d+kkyj>3?J} 2Du=)pu-j_9WWZ4Mr+s(SJTmzpKyk&u^%x z)K{|9TPoT8<@}2cSo2M^?tAx~PLJ-CZ~0tNlJTlxc;zr$H4HBvhP%JH*k1E6y!Y>5 z zH(UokB7 olujH+t zDO(Sw9186Ke+nFN-O9oLD3$9Eg~ZR5tyV?ZIuo4AuLREpE>z2l!MhKpg? gPWcWHGe^R z-JzY}2d^s)9RYu9P}%xnto%SI`%7i(Yrt26lin2YUf{wQ?h362?@B)u@~HSh74HW> zIQrR8+E=It|L^#lvh_jKy9>Mxd *8o1Z`s<~Q_0AffTMGIm ze4(wCVqYhvsaG^kW%Lc>!gtw5iM~#{Yo%NLfw(;ByXySq%a<*mE8)WjzSydYOf94@ ztCIg#iN3ieM5=Q|Nnaj{T(J+YMHjxo=FV&ImM#m-cLsc3cYp=)36X5j*D&kib $nOGOxd=a@mE?cNKA`(Y>|qphTZI=sUFJ45C&IOf|9#8jZ;s zH?FKGD3#XxYu!m2-p0m_ZfRxZva%I7S1w(#T8e+ey;OI|RR)Vy!Ob@#u>RXt;Ny2? zJv>1B%vwol+D)nk8Y^9brjq2VA-tR}N8oY 4qgF^RPs6DzPv>%x6w2)0| zi&74V+QO^0pKSkc65R) ep_THO}LUIe)jsM=h{ehAtC z$L|9F8R*|BfD6jX=1SHDOK+Se%`BWPO)oCN|HZQ tz->WX)|z&)QYqOMKy>Gb zI4ZNXeqXIrQdokkA8a07{)t^yWgNP~w6j*uXF5U8rE(+qOkpfHj+>w{a@l+ie zKj<#RjYDYoY6~{G1C4Y~GuB4Z3l{qKk0zR SaS(xbUeBq7kW zR!E0pPV MR& zwLn*t5_+^&iD>OoJ-UlVwn&fe)R7OgMicY44f#YOJxW)D5_ wwK z`v(|HiFWIN==ni<^sLwqy@ZSu6Q*xNo?=3JvA=bJ9tjCkO86H-p6bN(@Qmy#ipLp6 zv6QfVCs0C<*#L?e{vq^2O6dIrMHB IHJkc)kL<~s$6!dy2qo#!3e*?5PkXir$ literal 0 HcmV?d00001 diff --git a/app/src/main/jniLibs/armeabi-v7a/libjackpal-termexec2.so b/app/src/main/jniLibs/armeabi-v7a/libjackpal-termexec2.so new file mode 100644 index 0000000000000000000000000000000000000000..a413d87f1f4677371820586108fb88d9fe7efc78 GIT binary patch literal 13496 zcmeHue{@vUz3)C}&SWMKk`R7P!XccQ0T~kV6Of3gVG;sCkQlHcxZY$kGcZFYnK&7c zptl4|D{ZMJgla-;LB(qnwZW42ye(X*r7gYfTAe{$MT>VGP#Ww-J6i5dC?V&4z9%#B zaEj~p-u2d7?~k|jJKz1;-|znJ@80{n_t__Bvvb+1Dvsk=G8veICD8&Dt|(C@#sy4b zX2_ L?k2IMA~$59%DpCD$E>}mlZNrcK0a#78Qu7 zU6S))m5^6LPLwoCa%$uLOA#;F-z2p@N@1#bNgiWK@}q!=>JrtWzPA0-kP#*A7qzsu zM0|}!^?|0MV4$hN7yg^3Zt7ze#Bh5o5uO2BHj}Y&;8_@18p~uN`I006C%jCDAJXAE zVBciM(!p)8w+DPp!am`Hz%3g2Z-94c@G$Vxz_){w{zUXQnW+7#Iy?jT7tl|GjQn4z zldl1eL7tP4x9a4(fIo%262U_CkL%<=*Wq95@EIL`Uxz=^;j21)O^4N>N_3d|Yos7c zB*No$I8%qG>9DB7vvfF5hf8(1Oox~1@NykqrNe7Acq07w0Y9XPhsQN?8|3?e&ss-2 zO!M(0;8PlW8u()kz5;wzgH4#n$8BHMx6vk$NHl&9;6CVM%GLQ^tdlPV{sh57>yO&6 z0sa*Dz61^e-#Puu`riUx16-Mq9{}zIPR83m0ly9mH&uK80{kOjT8Cu+BJkV53ljJX z;G?&ZY*cQBBdOw-atrVSz|9GH5jmPj5_p9UuLF+R8Ec0F)LuX*-wEu&eB76iKMh=_ z8NZi-+co%Y;PaaC{yp$-HTYBDD;k`R%~U(yHsHgshiy;w=T0521&(Uu9vuz?4{PL4 z>2NQw1N}|fe_Myo0 4G^e5}zO42C>xrF)y(wZ-jeXm$saU5xm`jjnb0 zS+?EhakcoGylVrSF?g&Y5DfkuH6C>bB2^eO;>`i?-%-O8_F+EOZmn+)hdjQPmg*+> zKrLeEyjz>uCQnl&$hJ1Y76^G@0k%rnW?#hDw2iqVp@1s$2Eq)q$;;q{myjnIYVnQ!67*phw&54y z(!5ozt8H)dR(IHY>&Y!e@#dzjt_MbgtBN8FX1v>PF0b{qL_%So>uXgtuF9_zeWk!v z=_ mz}&+N8C1Oe;~ znh@F2bb76Oo6mKN`57y(xP|^L;zZR)`B!OcBjj)A+2u+)S*x4Qgzx&|FZB}>nbb?p z>zF;Y;8v4*i|HP-dUN0;Y~NfsrmLB_grcTIJ4>6w*ek|n17T8&DGoKQjkpo}Nq <-Wp0!Y=Mdq4|8^a{EGv>HTd8K@Fe3@QT62T__0nxp0zn*i zos&3FDTv }1MKWU|3=oMRRc zj-G0)O#wH9k_ksT^&Ot#W(6jb_^Jf2N$~Xv{&0d xjddI^vkfX7H&P;0SSa zbUSf0{5Wwm)J7am? oH!Q3RpJQvA>yE6;^mkFx!{r@AH0+ I% zugUM# z^PR{3+Ff*b`{2>{@R3b7G#@(;$gm%gaujtU86*9)!+R zQ4qO!{WX(_KYhhFUAxDhRh_kxwR6v=NUfDSD(6G$xyA~(*g`Q?b^xurHon>@wpMa+ z*EQz&OVsW+S4+2OW#q)mXybo^UIX=l%>BIou)T-9yS{6=`9x;F;Fp0u0?Jg;g)!9J zFTkI4af-+sT$GEKUh|{nMc1S{<`@@ccANi*Q;0sq9@!9E$ITxcVAj~W<`d@rOfegJ z`Pa-ROvrPuFdG-2ca7^|(uNc+hIjY$^b=S^{XKoG^VGeQMXCF-%IW?TQRv9=8#}Z2 zv3bU*Rb)10uun0HOr9+=yQ%XB&Iu?j7L~ytDsx3%H1#TjZz#p06(gz)zM!xJEYBP* z@gITzzgb@_PQ(~vJZ1c`ZI*fe%g*u-9}|0+MKpAB@%M)K_CwB;*h|&L7(-<+U*Ugn zOfL1mu8s@qwxOM_ MgdfNi@Ua8ct(Eu7T(>f~QT4(MFB%lmBQIQvxr>Yc z^AO+tBI6dEt~u^J8#5gEu0^<$*>dWb% EDSG|!IL8^RZmmKJe`X1;=0MxajK_* zp%>Xu4eQ|+Jm)+UGjucCWAHVn&UApcTD!P?9A?fngk0P^B;=+b1~P{pUdj23#T}K4 z @hRNZwZ^vvV)S5RXHty}Xr+7Y!M6@BV{LEU4zQ4Vax%4TQ_B~^uc;`%V<<(GQ1342jgL+$ z=Hk*2@A&r*`<#D?_Bua@M%mD31EjHJh!vS)To>QX#qS>Cq;e-0cMg@I2UnrBY)Du% zG%&p{jy+)o4jSLVv+q%m1j+#Y4$s5^Pz02|4u3-dp9C`aS^oxRc(2Wtl`^S a?_gH0gFC=?ueF@d_}F4R;LRLh?`1m>2_Gtk9-;j? z=d`G?+q~#>wla8D5e_`#G@jvlo^y_ia!dIA7Y4YpZ#h%n=N54L|1dB?6l6A=mxb=9 zoLAm;h$i^W`Z-5Rly{h-%#j*1Vw41#emPmdFY{v^O6 }ky>ig*!)WE3KbX#0GL*rW70JyU zLM&AxosEQ~Z71sBmlIS8GWfAKiXWIvXIB&-F!ArP_!9~zv-p#W-M`UfI4g 0;cTycBa |?hH zqEKS$Ew>pvS=_IrJi|Ye^139>MUB h*NmH zR#_|>x~!rdExp|k^78FQ*>Et^KC|N02E(&kyvBnmuXE3`?{ks?dyQQb4!*UVIi|)~ z;nY~%<`BRB3Rx*q_=DymF1ASg`2c^=RFnd5sqLo}Q!k5KlvIhy#o{1#)*n<-e9szI zl=5Kn@_7Gm8m{$?_tGeEy+TR3jm1+H&c4yfIvrvrcG%BGm?I-LSKLxXV`0iQ7kv@+ zS1E&~N=lI-hLJ-gJPiA-h(B}x6YdWhepZ*`%~p5pM#X%hx&N2`iU8Rk?`4Hp$9ST+ zl}R!`Hohi@F=}> =d!j tkL9PvGV)C4o+v+T;Sad|6YCHMD9=1G zvwxguID!|0&hhBYzbb| + z*^2k)ta`WMrOHX(6fr}b);n Q(yB}QJ>2&)?74o_GDQS)2v%C%D-16 z@eZ*MGya#D&|{VYRW>{mjk(4GKAP&d7`u#pO&JW1IK-#N=JwPL1<{!%ey`79HFTQV zKMI=5g?2;N%o$U~9DnMO)O{|T9fVjGpSo{-I6Iss8@l E}A}QWX26T2F}W@ZTl!`^*ak`OZDt_uMsu z>*U+{p67$yoS#-~v=oaOR%0iv0^ Cx3wJT3lYsOy!F! zxV-Er%j2Vb-p1%T>}y3c*xb`mmjBBr?U1W(yzDVzpJ(x(-N0*f>{p2A3~Qcvw=Cf4 zbz6+(-xZzfZ}9&vqf2D5w`8lhzQo+Y%^x3i%uoi|$YRlagj4Ika>JB6C(7h$I898j zLZ+B|qYp5O94XFB3j8BD#AVdd5H&p5;> zv)WK*R7}z?xkxlGdSt-i7rLFS*39i=bIGUbsOdl!_AQ*d@+)xS;JTi4W=6S1cJVE? ze!jzE#>l*RgV~b4ZA9O$L<{8!Ryt$-c*NZ8u9xaxs!x$>#(e69PcvdKZ27)3C&u-> zSTES^9yaISECcl(kHi0#bHWE)7gyZI92RBp=y1~CH%E#QN&h&&SyMXl{P-yGfv}J} z$Sr!C{W*Ke0FzSMDGK-xmBH{01KLW(bD;jO%rPmJf-@Z#GfNqAhU%4nBt0<(dq#wn zbPCDxXIOU(q)HRiXXiYL&bQ323?3gbV^83a`(J8~NA6AJ;#gU~>YFCc!1`kEe?z9V z`rLKHj9vK;GFqoBnsp&dc(EZXjkB7?-f|u%++LRJmn_2ksyc3AX2D-#O!_B*y*DDi z=oyv;d!Bdz@$)}occ svfy^TATt*@HJ}*5ZvpIM_fyJz-MQpF&MX62_R}>oyj4|GxQ(>!P zardww8*Jo1i+hGyQ7Ya$1k^C1Pm*Y_qbH(km_v 4WrMem^XHSZe^vZ5NCKVN8=gfq*O533p9F{}4;R&Hs_;d>^EyQ>VHhAytm z&@Q|?-d|T$Q6rT6#{l2`UG}bp6=g?Db2IbUnM_;e;xkNm<=Yk}?O=PW_ Hs|tItuz3C tE@Eq}Ofw(r!P$!+`T=TFkklPhxrLQEu^u@CN_H8Cm|Ex`*lvHYRh6E&iM^&$D#A z(c$@xC+-o}nP#IW?#T7g=eM~Z`!~)A@%{|)$v$Q^iiVCd$bY8@xqb5{ Pv z38?Xl>%#5E9(M}&-VdiU`G?uYSB=lGeWh~7Z3gkj71L3#Eq{7U;HmX?rR}!cd7 2l0 z$s6P$Y43rr3~x;n)Smz2^`{07GIbtumAw zyHlg}Rhi|7%2O?6qOrrYKpC_ue;(Ln+sD3bNlJ_zR6iRYzA^A)$9T2Pbi7~mRj?HF zC7ml}2EJmPJd7S5!>J-NV6sgvZ?ka=vJ5u(%USc}llk|?ewnBnAJNyf$iGVT<>CmR z%VKK>;;_Y{YX%&mV7*%&0y;@&KiEAqX4haHFBZ$E9qFn^zZl7|8pQ9abCn}zmU87; z2CigWg(&~p!J>Hs)b}5cWY~GJ3x4N}`JE=4YzDDYtrx{}Ys$dQz8mqx+cV5y!#r^E zkCOV9HnaboAa`V)U*fs;OwnA-w;Lo&*esrD%@#L=amF1H`ZDp{#NSv(+Jf{1RR+69 zejYs6nlpo*>zNiRWAWM7=+}0QKlVsfwYi$5K3vV7s^pJ1W6f`;b${~UrHuGqS^76c z(PB}DEjm0|hck6JO^3}oEa))P;o(2s?9Y%6U)ABb4qwsX%R2nA4$C@xUWd==@L3&> z>hN!M__Pk6(&3Xjd|Zd$(&1w|+^55@>9BO|=J8}YocW*NJv#Y%o&D#AZnj^klb7r8 z5*_|nSAU+aJ-<%ALWkD_n~&nj*vED=ByHaG73Er;|C{;!pC~(DF&}N~13zLq+GhEa zva?cAcIJZj_4T%us{GZqI`A@-d%>50Z>RDjIc>*21!ue4P7yzn(pLD{C|(c#s^Mr` zoG{t>^Jw{E;(dK>Wh#HQZ43C3ZEv>CijS5{;79H$Yuf}ak0?9CYWb^eZ-Ac%KB?lq zwx58X1Aa%vy=|X?_huYz8%|)y=cBj`{7CwnZHK`7j-<6&t|~iUL%kgEK5!BI7 VnHDBJws0eKhdYk4%B=xQjZrDif@aAp!3Ao-(zso{mm|>)9bAl9dS7Mj zn(9hdP3@YRWwq-bay_`F_TIHMODmSKBDx1u)Zz rhkgft&FSm%eGAflvTHk8ioO7QO>ae1C#JpWv?~_)&2Bw*3=u`p!;w$nlw0 zZI8ZLmjmPTt!k6nqD0@csjchqhiw0M(z2PO_pKiSr*s(KZ0UZvKApy3{J%u1f6FT> z7E6xh_dPIIT2OeqR9aku|BG*z9L>1cIC_C_F1tyojOx+6(7g!asLVEpf?lblu%rZd zDSf|GZ%r}|pS_uJ;ksokMKE)z+&Df bb(E6 z!yUnm&3atvYC-q@?nE(8F-B`e`|l%?29ohdYlL)3kJbj!N#p3htsos5bBbSzWm Z%^CC8FJ^MD-| fOP9&i* zss|Uw^lnF P0@8l6tF9 z0KMiXz_tI*gM6n%dX#? )yBrqD@Ln*?gdpwqMf+XIu@m4^xOu!po|5__1MNwBAC+B8*S8 0TIp5#&o$uUpj=wvwbGy&y6Bh!~ChVnKMS4MRFBe%Hl;K{{WQjy&rF2O^ zq%;B{7ekOEwgB6JfKmy37rlJS(7qRLcft=4E&)Epzk~jrPM^Z7P#`XH_ c*m%Jwf6sUybv9Ul2#2Os1=fcAsHz2JNOZ-8wgbwNHAC}V@hwARJlMoHwX zE8)`k8J|3k&Prex5L0t UjW8E z{S^9|r_Z$sdipoecNa;mVQRdT%I3_Hq*9qFJvEjq==t2shSSw8V=8A!>cHkrWn(;N zT1I)dZsm>`y9{fhm^Fu=O?`Fu&_LnH@YgcKo3^0sW#?c;FJ#NbTsD<2j;BiHT)`3u zrS=qd7WFLbZp{^PR%&3%$ka_?bki0!ygipUwiPE!y0yU6Ga17)C0EQ?dCBKSVK-(L z*)pwcX8n4nGwINbL$i4{Qe&78rZbk+EnQNEO;V$#nKCWCOb*&$6cC#lMk|#<+otex zNY8w$r01V;=7oezZlP%p+{L$m`+|!|8gyuvLqiVL92#+G)S(+38h2=~Lp?73=cZq} z`{rKx(c19*8-bmbH>z!-1wxhMRo75JD#7sW3ihL>LT{6KMX7h*(F;c_5~`f6_B;CB z9(~G{9J#sLyK95;&TLeEF&mNVvzlC+?Ut*v8|1xNk?+lfE3hNqoC%-5DB&|VWyu3A z5T2fwrz9DK9%2fd4r}5+7&tl;jwU4>Px_TiLh~@kbbU zT;5%)RZdhj#5#yr!-=$ik+ek8?Uy37bEW-O 8IQ8N2pIb)Sqf! zwC1z)nUD1M?R?)xJ{U_J`OqroluhQR7x{=HHxc9}-EQ w|t(I~wxl&M)oQxdQ!R=nrD8Lvl^+jbYTnPV9|-to?r2 ~WYCo-2W*~p`)pW;+ zHHwe=Vcu|BgLk@`kYBwT#u)b*`R6-stwB6h#8*XpjJb*!RZWawZngJXB9Y`h`6Jdc zBv-ILe%LtyA6OsQp^Y^1Wcvt!cM?9Z4jvy?$F0b3p-&m+J8{y^_g&-(^ShjoH>-W} zRyB#aa(-=<);{K3L#`ss74kH0T~c{kC2wBtmbWf{5qk6;lAo-t)mkF0(y#189&2pJ zA609!2r*3~-rvupJ6fA^vIM+W5bxH8oV?SqeND3+#$7q_=sKDA)QRTQiT}UUi8v7C zI!?_8IEO9?MZEnLP5tFf{l}a7LG)d_E`9XLC1M}fntiyJakLi;+Tnsenm077sNpt{ z)iQbAG_|#BOcwUuhFgHCjp;a}v)Wj(Y)g0!cNy5bchBDEv>k?p3xXrbc${$_@mg_A z +lq&+)o3qpkoO7j6TQ7fQLrp7MZR&gYD>ScYlQ$YINn=*~m>5q)D`FN|;8 zXW_mv{`|TF@To>~#f?LI2BtDbiSv~0cI=qvxM68L$$9zFbPIZ;Fvh#!f{f{vd2#>t zXA;_EF>5r) CQ!gX_dDI9`y74joVezSV)}lMv*+`q+b7Z3J}Y@3q=_(4YOIR+|Iu z|7WfCfa9QDxLf}6VXc+~&Ht-bn*hZTsKEE~Uhy4!(zkl)6Viu~5U?9IaTUSCrZax< zod0a#wU#rj7kvKgW1TYh{s$j^)b3BB`O$|Tyg!Gg)3V=hjOAnK^Ii@8#Navq!3#bb z7(N^DSLzm~>IOtu#AkqaoH;1J7ksW~f8KG+*lqy(F~@#T8R^vaU+|3}0K62T4=jNf zwSA8azSc5ABP#eSb=S%t9}IcqhW6kunmyyc;5$Yc%x(}Ckwp5Vt%s0n_D3}@xNilz z{xy*FwnKmC&_6izK4>Q}1|fGHc)#cSb2VrSa21gE%WhD ko|(C&lNLEv9l%z%ezhn9*wz#}vQ+6SCt;EjMwfln$-27vE8zRhl` zeq(feL-F0jw~~4vf$rG0?Kv&FWA}^ewBFcOZF786Z#=R2SuI*B8)YMJ=%%r*Q7BRO zWqVxseFDuVfoUg}1&-Zv`R6}_Z^yo@f^AxJZN$-V_4!uCtGt1q@bK;YHS)ds%nzVJ zU&BD%zT!9Pk9hc84^&Tse$>O~8UPyj8U|eZFDyf6yl_~2T<8{`#LNlPDqH%f#C8o0 z?~Cc9xv{)HZc2=2RAH #pNo?{YIPdr=Mv<{C_v#1_=F=HY% zR@Ntt)I=5vZck$Bv8k8K`caAD$jhaiHq7ahxeR>pxfmNSS`x!yG-==!8!OQUB9Aqk z7nsE70+gFPjXlJ@=KcT5Rc6|`x47TA7b(XLN_6)ehSdIN|4TrY66N?kAYMe9-v waTv0$E@il{Hv#$0pd7y|M1D_PaGP5(z!IPwzbnKv+O$I; `}o2@*9nGIR6VS%oRiRc~{V8X;Y5h>$^~59$aw!&R~E!p kSc diff --git a/app/src/main/jniLibs/mips/libjackpal-termexec2.so b/app/src/main/jniLibs/mips/libjackpal-termexec2.so deleted file mode 100644 index ae9d250de9f5e8a86aca6b96bb4c917dc3dd7a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71084 zcmeI0e{ft?701upP5M*HHr*|Ow(=h2$Cj2PbTUJW{IS>;L5huS9m~kf<|X@*Y`fWg zv-{Gf3 z>Wioe<+n16b8oid)|-j z<5`jM5B=xdnX~7edw$$|KkweV+1$N-$Bl}jkl&)TgxIPtChCXIv?;VWMg#q%(o#xN zg5ne sU1iB8t zFDiU2T$^R!IV*D}LF7vZ`dEDbyWxlVFOBQRAiFp}F#bl=X5oCOH*6f^HkGk9!~F-7 z=p%kaQ_m{Y3FB(WatQO{2F`ETG |NbTnxDkaw&w{GFScE&koPyzL(dBVf)bKkc%LzJl7iND L(kOsDvT#N4+M!^)i}ya#Tp=&z06;<3{7$7nD5 zZ^tBAw;`YBk%G+}+5Sx^{sip0H(m_>4 LiW!?_D@lN zkY6+!?}PWjKM=6bqAwM&b@=-N_7$+zfc-bb#{%|x_??Xe#r0FL&v`GFZ4FWn*azW1 z9k92 Z3k@Lqh`Rq75>41{WSao0ed&>RKPY7-xsiP z+(`}CyJ5!y_M^zBfZY%OIbJv#D?TgrfV~C&(*gT0@Ye!1Z@7hk-2=N4u 8Tria>?o3He>RtU6B!5ftaW3dNUY6l=1pV_7Y)p3_r#D{EDRf^(#?6yfkzzI zbGgDWjT8-oN>(v5VbaKO-pbKL9{u}Gi^h%dl3`&{MzNSLkZG0j`nZuUayYs$jgdle zKm6X}(z(KD+AL=C79p>M=@m>PPuapSs-pfT8Z|5 ^-%8Nw_xYz^lM zCByw>(*ULeWKK9~7 &{8X|s!y7hu#;~WyJ)Oz%LwW@71Irl6=$1}t z!&T{_QYl@s^dfuk3`ahLwQx6{(rI3|qcMv27O&>l$5YzGb dt&hL+K3~3@ zw)VB+7K5)$jct9=wieW?N0apJZVg{-{xjFz;nf{O-FDQQqOVmC)2XUOU#=cO?OA%H zI!#}%+H|sdCw;X#Nnfd&v{2QiYNRdLbgfd0Y4depxMx~R*2s?DHto+vn@v%#l8T`& zIDLNxYl_T94!QoM8sUD0wsqK8kCS7k@O_(#X_XY_NNt*$ifBnDJat6dd~ZadWB96k zzVd3Lb#;UecW8aH_)4o)h<@zUJ{;Y0zlOT*_$jCUQl)}AHN^d7=6K|``yF4h5*eh= zS0hTQ-JQcN9roaI;(3hG@v0M}+DZm7-}L6M&80{?hx^&)`8@87cQWz~j92l-!)v0S zIsJC@DfA;A@58Azg=etfvHpzp5&e8-HuB2-JTG@XYD9ZDh41CsDvn9|Jk(m0ZJ&=q z&vrR{&M}{Qo7N6Ks75q-M0@#rQH9 ~s0Rj_&owQz+IoNXN=NCehG|N5Q#;N?jQ`1ujR+^Yq2C)^{}WFsUnFYt)W2Q?7TO ztEy=8DO#X6=F03Rf?RE0!{ama7~5g$bLo3?Oy~b!OfgS~X=u-dnKDCW`dA~e`nAT; z31-YZ!IGF`ANU`K9ii3^-VX{b>frdC_g>g{osx=k-yZa-bgElZE6&;A_>>nv>%}uo zj^(`T(MOaz&ij<(oc)Hq)&gc6L-ePaF;Wvp5H}deze!28u>UZh$AuJS=tTKqs;wNP zDsp~s|6;!H9 _D9Q` z=^M`3;&cC6e5A|ayg>8>>hL^OdoGmU%J(f;y7!`Le+)GaO{Wr%b#V ;FL_)2Z3Gi@o@
`;!ItHGj%)q`Ap#(D3-z9V8L#o$2<9*4APgX9LN4wytBpe z9Ovv2)ply# 9&c_{Z(gn4n3uEelkslMtK!V-GSod8zcw(hN?=~^_vh7o ze=EFsy~WF8R(^|tg*I7_GQ*A3-VwAngzT$A_WF>W4B6cwyDMaOhU|`zePzhLB4leJ zTMgNlhwQh8>~$e~ZOC2|vM&qSmxk>2kbOzWULCR%Av+$jSB31hki9Zw$3phSu>JS! zYpYn87|I#y!K^i=_GXL&y{0ujiQo4AFF& e@Nt?fa-{z%^4ZmhhMzC zIXyqxyK} g?)*}ut%ZqPCf{wT&d*N#Bvtj|=mC5b^+P;<(~sYX?3x%i z@|HSMER0_urdb2OCd~`@xdvS70lgS35&jv+<93#KE%}1lSxR p)G?z~)CbJ04duN{3G5ySu2 z;-*42Li*9S7n%lEB=>w)8C$l3o>{&FAL!!x1CTMq@c*|EGpFP}*79KM14}=vd?xbo z=#fPqUHp+Hv&*8VTabAAiC_Hk%&&g^ y#Qi)$uMNhD1|TU&A4G-3 zAOtywN!1~zAvMSXqym|R*boyk2pNE+Abk)O5`z%r92QrHoQBjO3y=zA7V?g*Tdz}- z?|9dH)~o$JThvW`*Yx*o-gK>+G>b;j$QgRcSpWK<&99rcKY!NiAeTe@y}^CK=KI?N z>%Ndb^&kAVyMFt%Mx){9C-LCdKk4`zwV;14;J<-i@MwO56yC%w3iXu6N>SR zZt2uxjHO44`nZuE%OJtGs3)7xT4}vl)DKb52n_!j<@E9FFvf7wM+>MsTo@lW@^~=0 z24>!)TUIeUG+`Mftl-TyJ~LNgyYM;Ki|xna?{luf*x2T?$mfLP`0%g< =iFB@rFnllUHpOe5X6g%@mv-G`=FBxK z5RU7EaH}A$-+gpG*~julPdlCXID@#FZ$SI&IDzMva6kL5BP(A&Kd!}%wX+7tB07q= LN4#fNe%wC+U-&qT diff --git a/app/src/main/jniLibs/x86/libjackpal-androidterm5.so b/app/src/main/jniLibs/x86/libjackpal-androidterm5.so deleted file mode 100644 index 2d19d7a6e2b8946e55b595d2014df60269f78ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5240 zcmdT|U2GKB6}~o;u)*8)mKx%MNvG{3SwdK^si7ty71uxD;9%D_paRV@?9O@@*1OKm z*frEu VQD0C}HL1iyA0h=&nzpKy72$=XC_ 3BiC6#D~ZQh4g ;=%Z zsM_E?`tN~Xfc}cBKMNXsM2Jq8=R9@wGXG2P9?<`+$AEHsKCIxWp96+eM;H`;vHx%n zf9D=vM5D1WJ(@^m^mOWs;j+4AjHN6vrlrSDMPtcR(S)8#i|CPUO*vyQWm-n=fNrHm zjpqz2nT?yhUynX}psOP@+Pgp2+q50yN_7gJ^h`XLO~s?>>|k^_mZIM$w*3cUF(X z@6J>vWkoy2jM$PZNSn4xac3%Rv}K2eb!%Cv$6|(Qt_X2(M9;-VDjTy9sS(#L9qJRN z$t-fn#>m7)I&}gOgv~5RrWKEE+2S%oE{(Y~o^}T(QG#JTz17VCsSj (8@6w=4>s(sz(gv5RF4bH* z_a&@}1 N8RVWxvfQ!hS=>BuC6N2^90UY``0Q8j@7c z-;jJAc?#!eC0|dTKl5)%zJa_-{wI>>Fc~601HQlfGYlt6og0NH# ~MCY>1z1xr&4 9?9^K !bvg_lsA8!Yq28Edd#5w!9Qj6>J>z2({iSm{{`&s{GK5Y z4l;osAe4#HSDgfIGjx=%1qJSw0Wm(>+B0t=7H|q{i5;H4S{}y=sQNYRe#>-P^C3vq z&3^eJOsDMH^RtMw0ZV_!+0*{=I=R?obTBmNN46?sF6I}VT~OFbSjF$IQeMOwQ?s?N z(pCM@+RL-c?cv1#E(|70F~{YlLjE&kTO8Nwk;(BwT1yvLd7lh?KrXf$OC*s%`F)te z_0;znM0s-78l33X>ct)*q=h@HnzLa2y0o@J*tS<5xr1^qZCGJ_vCzv6K)*46l)>(6 zaUv-UXuAty=er~O5P!EUMPg HA#HA3|>B%LoJ!1NzHXF`g(T z9+mZ+L)g2SXdOaMAd-3r_HeKPgLV!YFxbbzV@0Sz`Q)}tBfZ&w*mi!=wrUV(2+t#* z59lIJvS^723dxlHeCCi=q*$;JVPP%2aMvO-eTAtzE*RhAGQRiLd;8stsJUt}zlkMu zX3G6W$H+4KWSLj)w+w~>%@i*^!NeWG(tE|JVqzvSBZPBIs?MRB!;zZJs3RHuMA}fT ztcqhfuEx^3X{t{?Zt|tpx8n3QRUXSmTuo$ij)i+zHC7x}jWKz2HZGr{TI+DCr6<>+ z=h7)7CpsM;SZ~m HQ zwDlkEI?#Vabq-}5xequ@D=z{aeSJNB&!~G13wH@OIpGR<6;QJYm6rrhh2Sjmh*E^Q zPwJz3V_MG)HufX*%;2ugM}(B6vW;Cm9b++Lm<5JRp6DxzL@xrl^;)M7qw3l3_TxI# zl|eO73lZufY(C^#AnlgtkaUIq2$X<2{s5}Z^ogo*U)4sxqMXCafpWe}yZ>(6U!XyI zAb234NEy3Kft;tEXbt%C)ja{VFW_qpC?(Dr05(Ivqf#GV)?2iJ9>?a={9u=(=V5#v z*aJOJZ$dlpBCr>-3lw0@m#SL>{ %pJhoPIs=X-wV)}0?Ka4&O<*5{ipxg_wnl2*4*#B ztp;B`LfpjscD!$1tMDJG?poul&{;F?4CG$&1Lg{B9~2AsSB3uKC$>FIUjbid!2fJ* zjiro K)Iz+MK;^>!r#~~wa^Sc@iH~rH }_j%Mh)#faB#EQ9NwXB zi!|XcvO^6G=Zu_@Hgwb2ywZq|w9JX$I9v*o#b7oaSDV63O;m=>q-o_W{e%d|PiM^2 zLk_iaBAnFCqzJH z_2`b_OCL(bM0hX@FZc;dr;amxC5kZ4$sq$Drr}K1GQxwI5m=?;TStwY$y4LM29! 5B4DEv+sz#7<+p9BYqjkdee^mO+1cq zr5*e3DWGS^=YkkX0Ei8|EJ<4D7_FlhyKqvV#f~eqd5do>CYR#SYgNa)<>|@ zAoIYpI|l({;JQKuqOc*3UGVIF1fJ{DE~Emz4FFH@>|Vi`{vs3tXt&)N%3tb;yd&^6 c;K6a&@g3%Y=a05BHdiqYySF_fQ0fW)2C25gn*aa+ diff --git a/app/src/main/jniLibs/x86/libjackpal-termexec2.so b/app/src/main/jniLibs/x86/libjackpal-termexec2.so deleted file mode 100644 index 0139a2615705b2d0a402c52097b6646a7661a5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9300 zcmeHNeQaCR6~AfRHY=X(L0SSW@Bp`@P@JSIUAtDpS(BDRAX(BcR)*`^FR`g(8~Zt= zRR-xCmm1e#)Ce(wwr+*4+Nx33s(^;JKxk4;)fAw7OhQ`3fH~3_T`5_&GQ8jKzV}ks z?H|?toN|@pbARWYd+xdCe)wI#Jkr>-vaGC3n5A5l3llAZ(0aYDStJxOT~v#iqEbwQ zh&q!-Q72gpGTQ^n(mzuO(o`ackp83B3K4bb)Q<)v`lWsfSP%3)(34~XL(e{1KGyuT z@Mn@AGLqT<_n-&7ph*9awnAUre-6G$)YC_4foh^$jv7LoD8$!HAR&kuvRQ~1n*f~n z_7dC%JTgOwo27ob=q=Hwh%Xbu4R$$Z;RRx&(BDfSH}vmd0Mwr{mEhk1S&9Zg`^!qO zqXb`Bg0CsT^Ga}S3BIiaFE7FMC3sZ{ZYsfTC3r-c*9yOK`XZYbE%HCAhByKURXD z0JhZXNp^^T6rL)SS0B8gd!cDXe=1k#GT$Qujc`@i+V$*T2o`4o;CPr>{flAxEl7i z1v}8C*b)qdE}_Lk-k`P;{gFq5{!3`#i>VkzTViuG7V)X^`06lXV2{Ov>PUEFe$nX- zg(5!D9#d70%%6ygc3)Tvi9{IkEm2KGwRqUusd{3fJrdg@;;I%$5Rs@F7Qu)QmT0q3 zbf}sd?h;-t5|lcBFeX6let}s0M7~fYuIitJ(S&TEA}3u!&$#OMYF@;+IUZ;7W0(Xa zON4@(kziLm!dhJO`);|#06v3v8r&Z;D#i@l%G9%mg_O%ZHy6tTN0_()bOp#fBW9z1 zC5WX;XE;-ZxDmv?>I7X4x(=j(E>_ARyx2L#^L4t>0LOv&no+lb<9LyUXY1FEx)q#f z9?yhILpBSX=i3}m1;`G%3WOys%k}u=xlNtG9w6_jfgd>A1wI`e <`E>m{D>h`6F^nNS+)6{u?LfWP?=(3k;taVW#FykuKv5|i;!G6w z%6!Ngvl^hq*k}P|FS8k-dTc~uW;#IO*nq@b1p$7H9h8`v4=BWYBxW^GO`MaMD 8rVQwEAevTO~i`CZsGv3L*fSF zD6x>3t^?h~C%=MVZxeAZ@u &J);)4?3N4$r4kHnjZ_Y>zN z_7fi@?v <6E7LuxsgAhy Np*H*KO=NBPwfNjV zIOBYO4bBR*Qqm1hOEx+3r$T`}9Q=>jL$>Q&d!82C2mgQr2Hwx)pV5sfHV)>Dl9}T? z7t;Fld+X9eZTUZAYPJvd>#a^^cklnOP{@e%8mA?_$XRHq%FIglI4e+R2!+-q@a@=m zzh`i5`sn&~>37@mKamdFbO$H$4d^zr1RfCQ9jK$310!(5OXaY|iQO$AvSyQm=m@on zZ1QcrX31B>J~gi0fZnpd{Rq ;WRh^oS!i(f*!xlzST+hX0As{p) +J#6pu z& 9=GP4%)w45A7(Q^$ex!2M&dM?vFC9vp zlAe&6Aw15|BbR`Y>0BTBguW{Emc4I?bq(R`y=v_B0DEn4I#UDo$M->>wQvNYZX8iS zz99dg9*L3~z?iI1345PwDh!MF0|K*VdUVg6&mMiAbBA^Bj`VBAIcYMqdOqxZ_v T2t?=5eV>btxuMrz>t3x%46qDCQPP$tGpH{^UhFBJpJ+WNeGIAvslsqW z#g}>-b}>GgZ@H?^%ViWgBbR0-Z$dX1VpVY_&oJd(jLuvOm^|4VQdl^bzv1Hinb|e- zw~%o(IVbXG=J&$<9sbt^`Fj$gOUa*{mkMOrF|lIJ{DtWiD?ra5mO aWaYk8}Ae4%#7ApZ_ZV*qK6M7!ZPC z_C jappHu6vCu_s#WXlW@0`K`^NL^krsU4u;X!!XLNoZ z)!4V_tb)2(#D{pAq|YFqJ(*cc-?XP{Ir`_EyD&I;I5I4*kh*b EGTr73TCtoF2|5A3jf?9@6fn_IYZLGXHS2UpCbiBnPgbE(n-BGv(or zmLAncm!8o+ps=3}VA~^Y6DL^Dp`MZ3RGXjSX*mt^b6xf@zUna%`u9KDCWo*dXbN@W zGc-`-(nHqicndW60+ktzpq|}5O;0xG9}_SY3C-@lQI}n-%Ra^w=6~}ATspEzw?05~ z7M8(e>^>OCNf|qf=A5hb=UdIB)ndAN27Mx2x!7~YQQalP1GsS3guLO7n&yPo+FcwO}MH zRzwmZfA}U%k+($LDHU(5qYED~@79YbaRZDRN-Y*iY!0c)LqRQ|)cDn|nyA* Q^+18eUv$;%cb91~ kXfwL~ne z`i+p0kBJCz0cCKBPBpA4?XgIw5lE>GVpO`kv0{@-*szpsYZYZZ6=k!n7Ryd7Ps- x7!@`gEnjZ5WEZ{ zOtA!JAAnAv%?n1G6x%#nUT<^ku&l6ECZ{&r+*5YjD$&w`mR7W^s6T46a12$*!5!m; z!p%loImQjp59<0Q&~Jd=U8JuK>w3!gdr&v@@9?P;@usHKPxM{SzFTd3%F3U#%($@o zM&6T|+h^fp(WydV6kOOUR@$t0+Aq^A-QxDEm)*S3c>|=fl+7+*wgh{K?HsT_fsK0d z^Fkp6nR2>NSOe|`-v! )y59^{L6vJvnoxC3Lzfg4>-vdIig zW?(V{lNp%Iz+?s{Gw^?r0mXbNfzjX>4AG0<)Omr+gZN&g3D0nq;CvTCS_I7Z6TF`C z*_gLP{2CHr8$Rw;;(1Lzi=mF+mV_Tp@hU-l203qzYarw!-7oM#{-VKuXYe6|{}G%& zKfVXf_b+_M!DmzU$M+xIz @3)PX>+tfX9n=Nd0eT9w z4|D`H1bP?r31}QN4S~%9%>yk4tpu$DwS&4qJ3vo?_JNLohCuIvJ^_t`rePjtaW444 zziP#bZ!6WS?pZruS>#%*EUc}=U+rS0I*M12YDo3Q)%oWe@sVHVf-aa7G!`9^kYA~D z)zwkyiU;tXPxEdTF8|hWd~2u9wU}@Pyzzi=!7(*@B^uI%3ok_R8H>o*b1pUDX^-KB zpqQw60)Di{Yt*1ezZtqv)yz74c{_tX;p&LM3qD-ZsqPG~`h?3D>Ex|VxWW-lb#;Uj zunPHa?NVcLUP3RqaJ`YZ2D$!7Edaz^2j&{#dgU6Yoa>Urb!ir}%5}xHOFOPt(kSYt zp8iPJgP3pHabJ+QFN*CjwetT6Ogru;Qr@sbRr;bGmb7e3nHy`0G-^77jO(2JeiKA7 z?YMtQ)7gPh%>A$wn05<6)!4M8h9ZCTMObfejw6I5k=`h=gG$_0WLNyZ9@MeWAIrTU zJBYcK|5JjE$?=)Rv{NClfoRA5+zmTZM_V(52T|u(X(#^&g&Q48#>>Js^uG diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml index f7c87ce2..4c085e1f 100644 --- a/app/src/main/res/menu/menu_editor.xml +++ b/app/src/main/res/menu/menu_editor.xml @@ -20,6 +20,12 @@ android:title="@string/text_force_stop" app:showAsAction="never"/> + - +
- +
- +
- 请输入名称
+ * 来自网络~~ + */ + +public class ProcessShell extends AbstractShell implements AutoCloseable { + + private static final String TAG = "ProcessShell"; + + private Process mProcess; + private DataOutputStream mCommandOutputStream; + private BufferedReader mSucceedReader; + private BufferedReader mErrorReader; + + private StringBuilder mSucceedOutput = new StringBuilder(); + private StringBuilder mErrorOutput = new StringBuilder(); + + public ProcessShell() { + + } + + public ProcessShell(boolean root) { + super(root); + } + + @Override + protected void init(String initialCommand) { + try { + mProcess = new ProcessBuilder(initialCommand).redirectErrorStream(true).start(); + mCommandOutputStream = new DataOutputStream(mProcess.getOutputStream()); + mSucceedReader = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); + mErrorReader = new BufferedReader(new InputStreamReader(mProcess.getErrorStream())); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public void exec(String command) { + try { + mCommandOutputStream.writeBytes(command); + if (!command.endsWith(COMMAND_LINE_END)) { + mCommandOutputStream.writeBytes(COMMAND_LINE_END); + } + mCommandOutputStream.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void exit() { + if(mProcess != null) { + mProcess.destroy(); + mProcess = null; + } + if(mSucceedReader != null){ + try{ + mSucceedReader.close(); + }catch (IOException ignored){ + + } + mSucceedReader = null; + } + if(mErrorReader != null){ + try{ + mErrorReader.close(); + }catch (IOException ignored){ + + } + mErrorReader = null; + } + + } + + @Override + public void close() { + exit(); + } + + @Override + public void exitAndWaitFor() { + exec(COMMAND_EXIT); + waitFor(); + exit(); + } + + public int waitFor() { + try { + return mProcess.waitFor(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public ProcessShell readAll() { + return readSucceedOutput().readErrorOutput(); + } + + public ProcessShell readSucceedOutput() { + try { + while (mSucceedReader.ready()) { + String line = mSucceedReader.readLine(); + mSucceedOutput.append(line).append("\n"); + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return this; + } + + public ProcessShell readErrorOutput() { + String line; + try { + while ((line = mErrorReader.readLine()) != null) { + mErrorOutput.append(line).append("\n"); + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return this; + } + + public StringBuilder getSucceedOutput() { + return mSucceedOutput; + } + + public StringBuilder getErrorOutput() { + return mErrorOutput; + } + + public Process getProcess() { + return mProcess; + } + + public BufferedReader getSucceedReader() { + return mSucceedReader; + } + + public BufferedReader getErrorReader() { + return mErrorReader; + } + + public static Result exec(String command, boolean isRoot) { + String[] commands = command.split("\n"); + return exec(commands, isRoot); + } + + public static Result exec(String[] commands, boolean isRoot) { + try(ProcessShell shell = new ProcessShell(isRoot)){ + for(String command : commands){ + shell.exec(command); + } + shell.exec(COMMAND_EXIT); + Result result = new Result(); + result.code = shell.waitFor(); + shell.readAll(); + result.error = shell.getErrorOutput().toString(); + result.result = shell.getSucceedOutput().toString(); + shell.exit(); + return result; + } + } + +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java deleted file mode 100644 index eb113030..00000000 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.stardust.autojs.runtime.api; - -import com.stardust.util.Shell; - -/** - * Created by Stardust on 2017/3/7. - */ - -public class SlowShell extends AbstractShell { - - private Shell mShell; - - public SlowShell(boolean root) { - super(root); - } - - @Override - protected void init(String initialCommand) { - mShell = new Shell(initialCommand); - } - - @Override - public void exec(String command) { - mShell.execute(command); - } - - -} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java index a8a847d3..632a54d5 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java @@ -8,6 +8,7 @@ import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import com.stardust.autojs.runtime.AbstractScriptRuntime; import com.stardust.autojs.runtime.AccessibilityBridge; import com.stardust.autojs.runtime.JavascriptInterface; import com.stardust.autojs.runtime.ScriptRuntime; @@ -45,9 +46,9 @@ public class SimpleActionAutomator { } private AccessibilityBridge mAccessibilityBridge; - private ScriptRuntime mScriptRuntime; + private AbstractScriptRuntime mScriptRuntime; - public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, ScriptRuntime scriptRuntime) { + public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, AbstractScriptRuntime scriptRuntime) { mAccessibilityBridge = accessibilityBridge; mScriptRuntime = scriptRuntime; } diff --git a/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java b/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java deleted file mode 100644 index 9903cb33..00000000 --- a/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.stardust.autojs.script; - -/** - * Created by Stardust on 2017/4/2. - */ - -public class MultiScriptSource extends ScriptSource { - - private String mScript; - private FileScriptSource mFileScriptSource; - - - public MultiScriptSource(StringScriptSource stringScriptSource, FileScriptSource fileScriptSource) { - super(fileScriptSource.getName()); - mFileScriptSource = fileScriptSource; - StringBuilder stringBuilder = new StringBuilder(); - if (stringScriptSource.getScript() != null) - stringBuilder.append(stringScriptSource.getScript()).append("\n"); - stringBuilder.append(fileScriptSource.getScript()); - mScript = stringBuilder.toString(); - } - - @Override - public String getScript() { - return mScript; - } - - @Override - public String toString() { - return mFileScriptSource.toString(); - } - -} diff --git a/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java b/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java new file mode 100644 index 00000000..c85257f1 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java @@ -0,0 +1,33 @@ +package com.stardust.autojs.script; + +/** + * Created by Stardust on 2017/4/2. + */ + +public class ScriptSourceWithInit extends ScriptSource { + + private String mScript; + private ScriptSource mMainScriptSource; + + + public ScriptSourceWithInit(ScriptSource initScriptSource, ScriptSource mainScriptSource) { + super(mainScriptSource.getName()); + mMainScriptSource = mainScriptSource; + StringBuilder stringBuilder = new StringBuilder(); + if (initScriptSource.getScript() != null) + stringBuilder.append(initScriptSource.getScript()).append("\n"); + stringBuilder.append(mainScriptSource.getScript()); + mScript = stringBuilder.toString(); + } + + @Override + public String getScript() { + return mScript; + } + + @Override + public String toString() { + return mMainScriptSource.toString(); + } + +} diff --git a/automator/build.gradle b/automator/build.gradle index b98a5471..4c1f3072 100644 --- a/automator/build.gradle +++ b/automator/build.gradle @@ -22,11 +22,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' compile project(path: ':common') } diff --git a/common/build.gradle b/common/build.gradle index 5e4b8d4b..b8009e44 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -22,7 +22,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) diff --git a/common/src/main/java/com/stardust/util/AssetsCache.java b/common/src/main/java/com/stardust/util/AssetsCache.java index 5458a7d7..06bbc269 100644 --- a/common/src/main/java/com/stardust/util/AssetsCache.java +++ b/common/src/main/java/com/stardust/util/AssetsCache.java @@ -2,15 +2,9 @@ package com.stardust.util; import android.app.Activity; import android.content.res.AssetManager; -import android.support.v4.app.FragmentActivity; - import com.stardust.pio.PFile; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - /** * Created by Stardust on 2017/3/14. */ diff --git a/common/src/main/java/com/stardust/util/Shell.java b/common/src/main/java/com/stardust/util/Shell.java deleted file mode 100644 index b51dd7e4..00000000 --- a/common/src/main/java/com/stardust/util/Shell.java +++ /dev/null @@ -1,264 +0,0 @@ -package com.stardust.util; - -import android.util.Log; - - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * Created by Stardust on 2017/1/20. - *
- * 来自网络~~ - */ - -public class Shell { - - - private static final String TAG = "Shell"; - - private final static String COMMAND_SU = "su"; - private final static String COMMAND_SH = "sh"; - private final static String COMMAND_EXIT = "exit\n"; - private final static String COMMAND_LINE_END = "\n"; - - private Process mProcess; - private DataOutputStream mCommandOutputStream; - private BufferedReader mSucceedReader; - private BufferedReader mErrorReader; - - private StringBuilder mSucceedOutput = new StringBuilder(); - private StringBuilder mErrorOutput = new StringBuilder(); - - public Shell() { - this(false); - } - - public Shell(boolean root) { - this(root ? COMMAND_SU : COMMAND_SH); - } - - public Shell(String initialCommand) { - try { - mProcess = new ProcessBuilder(initialCommand).redirectErrorStream(true).start(); - mCommandOutputStream = new DataOutputStream(mProcess.getOutputStream()); - mSucceedReader = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); - mErrorReader = new BufferedReader(new InputStreamReader(mProcess.getErrorStream())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public Shell execute(String command) { - try { - mCommandOutputStream.writeBytes(command); - if (!command.endsWith(COMMAND_LINE_END)) { - mCommandOutputStream.writeBytes(COMMAND_LINE_END); - } - mCommandOutputStream.flush(); - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell exitAndWaitFor() { - exit(); - try { - mProcess.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell readAll() { - return readSucceedOutput().readErrorOutput(); - } - - public Shell readSucceedOutput() { - try { - while (mSucceedReader.ready()) { - String line = mSucceedReader.readLine(); - mSucceedOutput.append(line).append("\n"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell readErrorOutput() { - String line; - try { - while ((line = mErrorReader.readLine()) != null) { - mErrorOutput.append(line).append("\n"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public StringBuilder getSucceedOutput() { - return mSucceedOutput; - } - - public StringBuilder getErrorOutput() { - return mErrorOutput; - } - - public Shell exit() { - execute(COMMAND_EXIT); - return this; - } - - public Shell destroy() { - mProcess.destroy(); - return this; - } - - public Process getProcess() { - return mProcess; - } - - public BufferedReader getSucceedReader() { - return mSucceedReader; - } - - public BufferedReader getErrorReader() { - return mErrorReader; - } - - public int waitFor() { - try { - return mProcess.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - /** - * Command执行结果 - * - * @author Mountain - */ - public static class CommandResult { - public int code = -1; - public String error; - public String result; - - @Override - public String toString() { - return "ShellResult{" + - "code=" + code + - ", error='" + error + '\'' + - ", result='" + result + '\'' + - '}'; - } - } - - /** - * 执行命令—单条 - * - * @param command - * @param isRoot - * @return - */ - public static CommandResult execCommand(String command, boolean isRoot) { - String[] commands = command.split("\n"); - return execCommand(commands, isRoot); - } - - /** - * 执行命令-多条 - * - * @param commands - * @param isRoot - * @return - */ - public static CommandResult execCommand(String[] commands, boolean isRoot) { - CommandResult commandResult = new CommandResult(); - if (commands == null || commands.length == 0) return commandResult; - Process process = null; - DataOutputStream os = null; - BufferedReader successResult = null; - BufferedReader errorResult = null; - StringBuilder successMsg = null; - StringBuilder errorMsg = null; - try { - process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); - os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command != null) { - os.write(command.getBytes()); - os.writeBytes(COMMAND_LINE_END); - os.flush(); - } - } - os.writeBytes(COMMAND_EXIT); - os.flush(); - commandResult.code = process.waitFor(); - //获取错误信息 - successMsg = new StringBuilder(); - errorMsg = new StringBuilder(); - successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); - errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String s; - while ((s = successResult.readLine()) != null) successMsg.append(s); - while ((s = errorResult.readLine()) != null) errorMsg.append(s); - commandResult.result = successMsg.toString(); - commandResult.error = errorMsg.toString(); - Log.i(TAG, commandResult.toString()); - } catch (Exception e) { - String errmsg = e.getMessage(); - if (errmsg != null) { - Log.e(TAG, errmsg); - } else { - e.printStackTrace(); - } - } finally { - try { - if (os != null) os.close(); - if (successResult != null) successResult.close(); - if (errorResult != null) errorResult.close(); - } catch (IOException e) { - String errmsg = e.getMessage(); - if (errmsg != null) { - Log.e(TAG, errmsg); - } else { - e.printStackTrace(); - } - } - if (process != null) process.destroy(); - } - return commandResult; - } - - public static Process exec(String[] commands, boolean isRoot) { - try { - Process process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); - DataOutputStream os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command != null) { - os.write(command.getBytes()); - os.writeBytes(COMMAND_LINE_END); - os.flush(); - } - } - os.writeBytes(COMMAND_EXIT); - os.flush(); - os.close(); - return process; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static Process exec(String command, boolean isRoot) { - return exec(command.split("\n"), isRoot); - } -} \ No newline at end of file diff --git a/common/src/main/java/com/stardust/util/TextUtils.java b/common/src/main/java/com/stardust/util/TextUtils.java new file mode 100644 index 00000000..261d6f4a --- /dev/null +++ b/common/src/main/java/com/stardust/util/TextUtils.java @@ -0,0 +1,12 @@ +package com.stardust.util; + +/** + * Created by Stardust on 2017/5/3. + */ + +public class TextUtils { + + public static String join(CharSequence delimiter, Object... tokens){ + return android.text.TextUtils.join(delimiter, tokens); + } +}