From f8a5b27ac8c91289391b11ef2070ce8dded9be51 Mon Sep 17 00:00:00 2001 From: Milk <1871357815@qq.com> Date: Thu, 13 Jan 2022 13:00:38 +0800 Subject: [PATCH] support mapping --- app/build.gradle | 25 +++--- .../blackobfuscator/asplugin/Abx.java | 15 ++++ .../asplugin/MainActivity.java | 1 + .../plugin/1.0.0/plugin-1.0.0.jar | Bin 21000 -> 23607 bytes .../plugin/1.0.0/plugin-1.0.0.jar.md5 | 2 +- .../plugin/1.0.0/plugin-1.0.0.jar.sha1 | 2 +- .../blackobfuscator/plugin/maven-metadata.xml | 2 +- .../plugin/maven-metadata.xml.md5 | 2 +- .../plugin/maven-metadata.xml.sha1 | 2 +- .../blackobfuscator/ObfPlugin.groovy | 72 +++++++++--------- .../blackobfuscator/core/Mapping.java | 58 ++++++++++++++ .../blackobfuscator/core/ObfDex.java | 48 ++++++++++-- 12 files changed, 169 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/top/niunaijun/blackobfuscator/asplugin/Abx.java create mode 100644 plugin/src/main/java/top/niunaijun/blackobfuscator/core/Mapping.java diff --git a/app/build.gradle b/app/build.gradle index b52f9d9..4b23991 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,28 +20,31 @@ android { buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } googleplay { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - productFlavors { - app { - applicationId "com.ghosthing.ball" - } - - } - compileOptions { +// productFlavors { +// app { +// applicationId "com.ghosthing.ball" +// } +// +// cpp { +// applicationId "com.ghosthing.ball" +// } +// } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } @@ -49,7 +52,7 @@ android { BlackObfuscator { enabled true - obfClass = ["MainActivity", "com.bbb"] + obfClass = ["top.niunaijun.blackobfuscator.asplugin", "androidx.core.app"] } dependencies { diff --git a/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/Abx.java b/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/Abx.java new file mode 100644 index 0000000..948ff62 --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/Abx.java @@ -0,0 +1,15 @@ +package top.niunaijun.blackobfuscator.asplugin; + +/** + * Created by Milk on 2022/1/13. + * * ∧_∧ + * (`・ω・∥ + * 丶 つ0 + * しーJ + * 此处无Bug + */ +public class Abx { + public static boolean go() { + return System.currentTimeMillis() > 0; + } +} diff --git a/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/MainActivity.java b/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/MainActivity.java index 800774f..4571fc7 100644 --- a/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/MainActivity.java +++ b/app/src/main/java/top/niunaijun/blackobfuscator/asplugin/MainActivity.java @@ -16,5 +16,6 @@ protected void onCreate(Bundle savedInstanceState) { } else { Log.d("123", "onCreate: aax1xaaa"); } + Log.d("123", "onCreate: " + Abx.go()); } } \ No newline at end of file diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar b/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar index e0bf628515d64ee3bf091e67b44f31a9674aba8a..66e87395c5e42089311b6a370e056332de23e1b4 100644 GIT binary patch delta 19745 zcmZ6yV|Sok)UBC{ZL?zAwr$&X#kniCZQC{~wrx~wtCI9{-gCOgIQ?n&>T#Q4!tR0&>wK^xlZYb5S86YY;Yf?J z;-P;s!;>quo{r?kqc%Ct;F~(`e+V9=j(%pg;Dyv0(*Dw&;^)bvhp~GIHQ78G$mbMO zLjtl}!+P1I^_B*(Eazn=sS+g)iK zAisKbqeKZi0%na2xPGWN&iIX@$^7DZ@&LeOS1PrI^I zK-N&R$HDUK(3(O-J+g$ICN#=Pw8BaIv9YwnpUXUXqCNib_P@u|`T~!bEhcA@c>qA( zKzy)^)|DD#o#n=?+9PdqpfPJ)>IAvPr10P0w>lyr)BB9xE`tat73TYC2=J$|TxDos%UjAZ)2c$ZwHQ3xBj>@I>)8 zQ^0VC(9)oOvZ7NwLH)mFi~K)ztL7ck$bt4>87HD8F@tjenlQfj>Nwwh)7LZCmv$-( z6mB}PAR!JSizOkLUG((i4e^PD@y+DTg;|$m8NZsErmhz-8O6HiB1ys_g!@JKl&B|4 z$@LEgovQ`We6zuf&$;-L-~1ZoHAmO4ru}eP(`w) zh*GYqL|@bCY7>TAh<)|2^~(0qc#bDBI@V}G>*DqxeOUtWoK?Z|2BulI3imaLUz?FH z;gUY>iMI#`@?&TBnoxWZ^V0Sy2t4-Sh<%mGe5D709Ngy%E(nja@WV-BU-IBC2s#_= zg$A`?261IXf;lH8Nzj*5?2#Va>qTeC>($%ep->pnt#TtSx(nlaGZWO{nrk?`eJTYs zEA85Ub`Of_LNb5xn$|GFyXiVuHuB2L*>^1_$vG-?wpLF{0lm8vaY>sG3LLo&a2drt zJ@FBMM_Cd-Z}#<$NG)ZC$ChW@q0Sw`c2CVp?GgGALC90X^VPU);+-4IBG%1V*RN7X zug#T;cG&U??0G&T%f^sy5qIm&UkA3A&Ej4G1~W^I78ieWDwD4w%~fCTlqM#QKQPp? zM8aWxzEsk+g$W?GS=;4MailDohN9rT%U832W)>CWKW@G)wPNxs^Rav{9nX9-ZWa`_ zTC?a2a}~(fiWVx?QL*Y$!xS5w`i@^j@18gZ?HpIo6qC<10wdvJ8&~+EOhsfR@okIF zf97J(nXyu=3VA=Sy2+i&Z0ALvu3|T_c6W4nmd`d)_lCiC#+gM@j+;`EGL~Xk%bIop z_g|4oo)VL~VCyZ?ketbrrB~f2dHILt`II)kG&eJ`#Sh)m-gW8cH7S$qzA5Il`?l3A z61-=fsO{=U#Y}aO28-p2)H2Hsi_)cmPqpIUK zHCbF}Uo{T9-yP{Q55mqfn(>9D585tR_bia}ARwD=an|NQ%G<++? zoK6AnL+p_VS)qiovY@(2=Ew-e zNLTx1$CM#cqtMhh6D@zO-B^?K(V5_L8NT*fD%RY54g-C^X?%5Ef1eZ)ktuaKAAC9A zzpD6?NE*7KPB25)@rnd!5j>PfGu4z~jQBMp)5#yLr=C|YV6EfuXdn-3+6J3sNqXmX ztur2QMEb;pBA?UPC}ZiFd7YI^XC6bQZIRlAWm~v?ZO|Q2%1opo-`PxCGg8PzPLn80 zO>2L2q)xg*p{#?N8%)eA~s%bTHct2)zJoPz?~Xm$ojDRUZi_@#F7 zB-uDKH0a@~&{P~-uQ4^EDlVDHewogmx+U?iNZm!d<9ad5AJc4CkRs-Imt`Khwhl`- zL8aOcI{R`8qTQc_C050o(rP--M7ri%L)!@cAleyYJ|(s^MUX5K``zS>cv7$DRx&t2 zvGVhJ!T7avET0BI!4B=4d_*FSht3Qj3G``@wxBP_*eJTa;cO8bgWv9B(`!+yTf7)( zGiku7T*RUzu_z9oGnir`b;V-K`U3`yG*Jkxzw!kZu2)d?XHXHI#0FAAO6-tE@esU{ zdnUkFV`-lXfBM^t3o?caQ{F1SceH?Dv?yxLpms4G35prGJg(L1h)Hd6`PNermvTj1 zG3IA$K*Xz`cik@GLOSu;X-6kGEv^IK5G$Vu;z*iNL}*+SVfb-wybme^e;{(r81{^t z$!51)FF%-NAR1hx66VC`T-VPvg_ao_l^n|H(-$Sv94(zL_g1Rx;`37?lr_AkCSs<7 zJu=)takdf=6Cw|!De(G3Rp^b)t}mMI3?hlHtjpUJu06EkTv>CXG?XBkPXD7y%s#e= zW28LjJL`qZ#{SQbDe2%$b9f|E21WdoIr(jP4Cm%E#)I@AE{*-4ueHQ?g5ihg&j+9Z zv6`O9lw|NKNr&A%TITN%Jj^KUMR7*+`dk&&qF26vOmdBO3v)mrIYguto2bR(&rIJn z7EjOJaNh~$K@ve-TU32}!OZGB+}H#LW+^sRbrewtNy`BYZR zZv1;R!kD12JZqMqB`#kOI0er0m|J$v1MKS+4miowxdD2MIXrfp7bMah_Gs14V?^V5 zWK3J&Wk0yKazmB3^PfnmhZ}^A;>GEGq|yzQ$v9K0%EjX7{J6hR``O{?&YYQzJXF2i zq*_9d7EO!p(7lY0D=NF{yu~!wM@IG2x!3NnRJmxcJ&Vr;|0Pl5@nzRq+ho?uYi(i% zI~m3&eyX#bMVNLt72Yzu|J&>k$K|*ssR5kxA?W*8_6*~fd3#p&%`hzAq~a%5 zeIlbv)h*48+Nep3jaZe=Z+07)84X&e*o{aI^ScoKAXjz7t8<=e)i$G|jj)F$Q7%LN zSi~o?K8CyjiYGRXs*?uMp73UG7_f77JL7qS(=3F^HjtiPg~zv6Q z%Dj&eYO^is)dLxTxYI=K3%juG=nc5gZQmIsB-=g_)_G>RI=6s|SO{c4B{oy)L#@rk zO>e9zpH}>x672S>y5Ha4Wft*Le>(nVcHsvjVu4%{TUAu!nNACw=;rsKv z|HR{|)KP~*^TIB2)GHz7oleAB-f;*#wPf^GtsicXH}+OJF%!qkgODE5UL@l!Q%mL) ze;gsl5RQN`tu0CLZgJENruci^XwEsoU~_PY?E*|)!Bq4}#A2@)Z1^Hg-%R(7)kCmD zS7h}~x%x?l@@g^;op4ssY?n5rFOkp2+4JuA$QnD`-T|jOwXzQ`22$s;OLoE+IXh2S zBf4isM>sT^CNN2)j~q7}zPx!Jo^!kn8;51-_4iosjQ=k~{%?fzFIqHD0tW%vhXw&* zN+SM20mvIWIaxbcGML&KySm1x+pFTKqx&;xHzKDhfyNB?DwiPdWMb+H3#rwwS%F}{ zsx)`P$TqTFj%>@9s9W-=J_$A({u|TGXi#!1J)|V~g!=;d7Q@KvlBOa)lcP-PI?49A z=AQMM>F5GJUnbE&((dG;DVa+Swvo@7mc!GW0rg=w=qFD_npF`!R24tLV5E3>W5_1? z^uaLsS7@S1bAw?Ku-dS>z+p%__B}LehRLH)J&nv;Y5`SeRRKZGyAW9Ye1Fr8DIC!K zzn%WNaaq6g&P_qjLvv@dG$is%+SPBT^n4{|UF)28rnEXWojh-4j;=kGr_VGf1a7$D z0VWOm45R41cI%9t;Ql+U7SWr+-z?^JxGY`PI87lj$@_Gt)G+Lc&5Pa+${unRY0;5s z?D_!##g-?BsoM2!u02M>s@(j3lL|E$Tg}(&3Vimwp~2L&q|oNmbQ0AfKj-*v?&$nJ z;ROugf^$|0R-M2>nPD1trcdM)^X*GCfbjeaS+XW7t4>>G9XO++tMrVDZ2y;9p>Rpd34X_zCk=PM*Yc|nAA-y_ zIE4)=g-i_@7vWADPYCByAIz7`Ym2jjefXJ$w_7!t6HWH)0c!*- zH+VmFga6)Z!^G;)1L=##tXGhil47$-@`U?Dn}UXiWsLlR2Hp2OAunIM_{v|gj@)a{ z>%=qjyaz~PdH$Bm7Dk(ydKMP+H~D(Aws;!DZ7aHjaxafe+H26bW4Iw+0JSPq*S1xBOEx7-vu{SvX^@MulakhCmw;>mn)IS&&bXreQ-kI zvv05oj;HsdFMV(#;UoV+4gxT)*(Z3lT1ro@i8@KBjr7)>2;Pk5DC@2cJbFk8B$MBa zPla*TAJlC^mk&ZYkv}kk009<*4HAk3q4-^vy^r3!g0EPMw>9BI(TMN^(_q3P>h(S- zc_RxWq-jv3dMRSMTRa^LDALhibMH>yd4HsW2f)DFp1%pBo3HZy)XtQ0m%gd!0T#@b zex5=iU9pSy`e(sl2EqjNI%IWcwc@(ueH+S0QvgLmL=h z>^hM?b!lr+1qB%2h3dogkqKp|#9@jh?;`@tFp02omEbbp%+YB&{AWlI$f+SoJ+VCF zD~bYdjkWoCZ}$Z|!XZfBSR+~fH{cYvm@j7C?R8*JEIac|r2g17r%JG@+5K(SKBH+A z-~V42{@+G+)-rODd#|HZ=}2bvCB{4VhP7K)x|H8ia3AZKT%D!)dK)z&896 zVp$GDS7(lk&l0IE-%wz-gRwAclAN$Wi=_6r=oIti6}2b5Uc0ZXkQ<*zui>=vbJMPu z9Rd(99|wc7#Mq2v>G^v?{@@)TZp7+-mJcw5N;uFNzY+J!NCDU*|PGscchK>CxNLO}WYUedX&)*@L8P$-TJZi45q1yPn>r}Oz?ZZCQ z=U;f?psYBA0F!{{>mE5HvUMnhi8cw{K@HFz7Df2;q#XoRXl}EP79A8ZDe9GNFvr1j zTd5ntaW|Os)Z(;qt>TaJXjTz5Z=O|9{v+Rk$)fql@^~z(&nH)?56*Rklsb;ci?hfl zpYB-PMU~kyNu5@koY9&bJ4ZpuVWcsYjRiqwaK)mTxfNA2!!qR__Hlg%J|h8+^Wf7`OgsQA>@F%>zs-{WsJM{R!T7OrcI zYvh@qp4emWpv8_TjzwD=Vn#BHpvby(;zmz-aXe+?pr(P6T>DhDZZ}4ucm%u{hnC%c zSo>tBj!kc-KGY3OP$Y8g%du?r-Q_BEfO+Qf2O_z;#MR11A7MB^s11>svc5sjxKI$0 z7iX9he{y1CuTt^FQgY2v;@Eh0wSHI}X2v#dF$=~j-a33p)2gC3mCs7(CH3i@e6k4) z%KK}Gfy8t__~#OhR3H%+px%57X&Q;_5idT{J#yavd zHcOoA5>sMu>6l*6?3o;o??CzRu539*`L9HK(0U`F_fP z|MT4@w6RoPFMWj*Gynz}#j{5t4B|DZia4EWejC0yV?c@N4bb8rIlkIL^{uQez36=t zf4{tn(i^{$ZsW-)0O)CiD#J*GxZ}BrZXtOLp|3(87IMl*0sofLt9eJbL**j~ZHS$%ypZTZyI{!k$u#l%740 z$PO#}rW(DS_5qxY;itE!d_0F{Ci(pJZB6|3asD2Qj=;$^H@@CL0R;Y&k-OGVgBe%1 z51}7i`!3vMGZawLkh!#4upH=I7F*UE>`ZJya*&S&LXO^eN;dC`JR$hT99Xy@pzEjF zD?l~s8ScO2dem_;;&b4)ps? zugJZYfsTQ)MHaIM?h9<(Vs?Wt#qRJ~d;yJv>Jb%7_S#$P<~J?6)D+qB77h3Kd##WL z+PwB>K&b)T^vMP!51Eh-g$G<#lz?E9bsoIXDkM@cl5W-Z}fWmtZp zD5CY%P3y!SNI;u!XIY^;#rld$f-l^Mnh%<;0~-?lFyxGboIX6+#WbbwN32!%YT}=u z>}`FEth@YqCEs;uT%nHpo3V|*!D@N%iQgVlXJu9eEg^#I91C6_`t2yzX2VFkux|N@ zEGEPG6&TuvTa%DENjFU3UJKf)mq?Qxj-o$@pgf|to2jpyhcXEiTK1vsd0f-=G4}B$ zfuX}{TsSpu`5k0x^bHN14$V6YER2;3XQZn49!{z(|wY_W0}Zjvr&Y%FWUZkaQe z?1Q%^@$OW3PbP#QMEjJ?h88PWYfrZl|@aoaNYVfCn-Ic!Y@Bcf63E~|5 zr2P+GJdr^_`2R~`#Q(!Dbc&cjj^;XmwuU7ZwXMMa za*WMS!Nxu{9QGP51;#X4v<{K+U$n6a8b85tB?&eKm=kEuR;(&1xs;VC=WKY3DgyP{ zMjj)xDqXlSCRs;gmIwz~@V8kbA2`n;R;Fw>aO>ghv`ejFNkE@^y+A!iSXExii?C!R zWEit5K4blss5}YiMQI8FE%N+RjroS@!hV8`VMKf;3HZ@^SP7`$y4!M;i- z6ntew0-;WlF{QE8(v3S-A#L$4m9)ja3e@0dpX}Gt)-WQ*g|iQUPP`?Yo@SmTR)-?5 z9DFB$(Nd#iN(Jw@no^JaADQ zRJ|F(R~Mqw(IOAvR6g!ir^`^g4`(jal-c?D0!gs#B57x-mzGhsXYhmFag$uM4N=GI zqqzTF2a`x6VZ=|_ZtxS7elli_0|E)!F5J>a&4-;KLaJd`(%war}M`#@tZCIcSX<8zo#_k=Ew1%8hXw7 zT|4>o&L%*Y*RKzDUEbubdfrIM`Y^4PYDtJ5&fn`{#f*_XW6(0p?m@d}541L+L8P&X9(ldWI zK#JvlPFlc&$TJ#elI}V-7>;or-^GRPKvkR*`p zM`Qtn|1^Q3yd^@U;ia+N?PW&J9&}I%1kJ*1QRK~vPb9K$I@>?d^!`3EU-nfVwy92- zT}gvDnDm>(@D1s4pII_OUBjuH7f$8JFMp-!#T<@$_5SI(qlU3N#CpG{YZulqupsHb zNRon{HL*dua}aR!to4T(yMVk&*Z~jeKoS$spY}#voF^hjA56Ssl(^*=D7qH0xaK*- zNtOGA_V4#^A=S{bT5p(v_8&4SPKEX#7*n4VdFLwTEp_m602efMo3_D`ylwo}vs_Ci z<&y6y?XvB@loz|DWteClrBz;bq*`_w`+}{hIEwBEyTj}EEvkOGd0P~6vmXDTqT&LI z4$ut}UFU4^iyZWu16@~JZhqp~kTCF`xuL73E8h|LYEm4~jRt20tN+PT*6aTrxofJT z<0Z|&>av!yq5cm>v8K3RkX2?iM&0h`CEpjF`Qk4@Hu&d!vTDjy$9=6ngW6h6OS#E4 zO`KUg1^2Qup}p7mv&^m2#x>B-pH1(;l0npV|I5;z%M*jFO-a(!U*;?Xvdk7*g+FWd zsqnG5#Iey+Ai=A_f488kBPK-t-aKf*O&g*itrv{1hPxN1b?}VAI6wedr40rA*;1_v z`!lW2@1^fz*Y0*Um4c6z__w#1)`2v?5j+J2eo_khvmY|#j@Na)Vcho>-}77p{>TkN zA?+d%D#KlB3DPz%#Yr2-&8;qwHN;atF$UNK9#NBTt%ENV?)s9)we5%$o4oY7|xZ%Z7TSIyQk@W8-Q41$H(J;q0a{hPPb0eQc&R*j(oFTek#AS7# zycO%R!E-^XYspI!YRUB?he%Pkyx1D``hRvj z>Xm=&j+z|c>X84174V9QuT?@OvF%590$KH4B8S^KmgFTyVg<><3FQg^;?Ukd($V6a z5vT7iv@ef$i@4$pAk7$W9`^;u_WDi@(buY$`yB=`vTp~ue{0?r6V04(mE{Zt=b7de zKE~(q=ID**bB^_EC?nw`yv0@`uS!*>_F`PVvdy`PBO+{hWv=6ll-TEQg3F|Ytswt}% zlw|d+1=~e_f?0DMwt{3=bN+JPN*~l`@z1Ucl+A|mIvb4A_E)RL=2vaSqb_-Y6&DR-N-9M!N8!_CK zf66ODfPhfI{ojaz1Tg>aR&S1mt_PYr`j^52i!sk53k3R)A2so%0mLa)B{q2ZE2Zer zn6krM8QI0ErL4{tpi5l`2;X6fy=qP=B$Ja#)klsd6(8Bsi>Z(r4M@C}&+8|bj=+b@ z`-@=T7vdhYzY!OqxB6gmZ9f49{YjW9DOru5BP-M;d`-_3IW|_$~8CA#OBCp)aUih*`si6I(BCzF)gI> zt6hCmU~zj=^Gs(apmYrL9ea@<*v`AmaX>7b$rOM7v5q$h1;yrOS`~@iYJD15TL>}B z+#JmMtKW&`MG#H)M=Msh&e*4Nnx_l>OnzNlPytZ$lTSQPOmrNrAN!fJpunStMganv zxICIi^Vh?J@Yo4@_mI}t zYpZoQA6e5%A4_yiyFdT7=MS`;yrSV%BMhZS7m;edZlBO$R@@ zW_riTJK-1+wucriU)u>y`u?>Xnt%QEn+{F>{#rn^ zQ-SZOr5p)9QK{c3mmL&K96M_|jHc~I1=L1a4I+f6eb{#oEbYTcMcJBv??4Xms?Yli zo!GnOC;6)jH(&=fE5>1s*PYtN=LTcG+v^TIyH@l*^7DN+d6GIs{WW+qCZ)jMtYYHqF+FFxL%(r!p`f^s|KM4j~%E+8wA7^@b& zLj^uQo~G{~1Y)64a0p9sOk*A>i@kpUW0IG)iMVThYE}Pz%OJf4;$6|^W#C?!Ad$$e zXj1X(F3^iy)S}4!iu1W341j+~ibTIFb!#{$iC_bU;CW-7Zh{2{{chw-2wTvQGu+OQ zQcmptdkvII6!yHSAW4GG!0P~k+~0S?LQ$)<+ZnZM28wsgyX!zReXe2-D4AhZyFG3b&rA4T@@ggRcN0z^NOi#%*_ztst%pIRJ+n{BuyZ*=`$2zR0{EUm#AD0_elrs#RcwU1qw-zuC2|S8*Us>^`;}5 zTi7M^6riS`(n*He0`{L7r~O(6Lr(uax3`FJh){DryRI5tzewVS zw}qv|-d~(!dk)B$X5(S_jpL@UX}K%dOxB=c`h+R7#l-wd4%0==hSuQRaW}0X>40!j z&eUkUL2nMU>1|oOAeg~BVYkfGmz1l`@q#LOA;1m;IvTt68h=)!()L`4#y!_M;~6)= zs=Zu;yt-nO#7X5U-ni{7LM+Z2ujZ^-L6SY>q7_4v+jjjp93>_}K=l1|X&4iu%-9;) z+%p0eVflwYuYNyTYA!zpBU~Xqqo#65(%*4f@XC@k!ck>?NqYE@3z@ZY6YhaTASY54 z8A#MShv;U(27StLRe0nyLJvm~4s6#JL z-nBb3mhVK3|Lk_#sJ%c@dOWX--5iqNYd}yEue{c$D?u>53Ct=0eHlnav;t5C@ zT_~eW zDP>JQe7K3(M^uC;g+`AY<9U+2zw)%7X%@mOUJb<~hMCMczMV=(3LSnCouWCCpq&L8 zjd$Je_~4EJEO!gm*-rIFe z_L`EVDBbShkjDEI?)l;G4Q#?*?P`=4Z?f+a4avX$7JA6G^__KMxl((La^Zz_Fi!au zRW* zxwZ9U><5YfQ#|pDE#b+9CHqOQ$>{&AId;`*hX@dEwr(fy^}W!2a0XNRKj^OG`#H)IXBZSuD{7Y_B zhKsRiaB}lhm&5I9Zh5~AXL7GkHTjE<>wt(Fr~NzKc&*OYlz{{Ar_RGX2YYzvKi{CtY6k_C`H=Ga3uG z@s{k5p}6;f;fXJpzAShQS572NA&ANKBIfRTe?pl!sVFPgSF9C5aTb)~`@P=Y&N1?CjmK)Bv-t+8jnAO-Z4QthKzY=)nE|GeA9r|ywa=uo>+9%A zjq${OlhxFvXt^=5l~t1YY6&r_;}YBQc6Z`QBRUA_ z%EdJ%$t;fB?2JQ_c*c`|+>Xa$3hY!L{cuA*EK(1EWZX|u-v>emp}1^88Lw&`pF_J7u6!Ek{$530irS01dX?)rWTVjB zL`9P>T*AHm{YD@*+$B8OzBuvje1LQiA)QG^GVza6!PxiJ6+W7H&B-{7M2FfJg_zAP z8e^E>2G&;dbC#F#Yiug>#9VQ*%|UG)hZi7g*xRTv7B?v7oI&ij)oO*i+Nl@v?f>@7 z{PRg_9|Egz%kyZd8(F2yOo6;oQL)c0?W~5^$s4SwTPM0#G|AcvZ_@VPWH5x8Nnp4^ zkV0uFjc1AYL%kB9^m`yIlO(~%d4vnKK&ZUi890=VhFt6@-Y~a1a>b(huq#f zAC9hr4{%%k>G)?mlA>qoo4z}O^$xyLAFcnJvH?@EAjQ})Ow`KN#61D+T6D32Cm7yt z1Q-poj31^V?MUIP9bpi;q}dAG22Vf=;`2f)Mj$BD7!e6v856Y0*rktNEGG`G3>k8Vqy z8Ta7sV#l<#`3biFE)vdP1b*N9D;Agi`vGii-OMlWe;P1+-2Q>_eFSlMzFi})xVhUQ zx_t5Ekl#Z?YwrE}_Dp0tgIZ965avYK0J?URWwT+8p{63CG-lGId2JDcmgrMp*sE&^Dp zD{iV@Z5(Pb59>+x7wAYI=eS01gHynQOFlqU#V!`ss;e8k;TbDz@xUe>q&7Kh*QIPD z0%o94BiAE?IZttgD%T2owx2mKd&V0tG0daND$p%@p4iKI9nse+Z%nE5CFA1&AjL`@ka90%@`C+@~DXX z!r&KvmlmKc)Y6Al;g~*z)PqgyY|p5FZNM9nR*b#e!x2HrPwu!a-kyT`oQyT>ZfC9! z@OacvSgQV10YFw`4^JfP=E(11eUK%C^n4kL;Lm1b!+)hdZ{~)#%6t&40vcB@dW?2dYAhoe{U6X;1JD)~x?~}XvpP3{p#T4tMZ! zC_w^hbYMJHS5pK=6aSeJb3{zXL!d(aMKFedHim0mhi@f@cA7$cpyMA$G8<3Gg;t;_ zk!P_^<*?sqMu=y#x8z}K0);UOD;;;U7?ZQKwX`p5^0461U(oKHmXkUKu9M8xQ=_F% z4i|e~a(rexPI5mD9#T9EKT%QWPp~plwJLxBqlGC7_Xj5qoJ;xB1k#EfEe^E#8a1Bw zBF*Q^7<%!k?+$Ojk!nOUMDn0~@$vIa(tCo!`-kgPpl^pM)AYn8m6Y`&^Q4r;lv<*-`p3|{UBV4&dj9FvZjEKE z+bI~>UXXR?wC)NEnlMO%(XiFn#@$q0ST$C~iW%KD3uz4uf0DKAh>D#1xlw}J(&=JT zhLJ*~HEC-9S-(PkJ?5*9A`+EbGYfDhP+I9fxUkH&xTQRCIi?6w=2DZvR`VnmD|BU0 zigyoJ)0{gsq;mGPhe>K(>^>Q8@-&s%ZrpMnA-2{Wee9+aRw@#(@mbO_MM2-R3oTJE z5cKqi?*Nx^TZ+@GJka5J!B=OG7>hpe=jhm$e4Dp5tXEb2EeF)U-~IjJW^KTEhJci2 z5s2!c`&FGX!7nr?Tbhi9g>~p(raJi8H|#Bk!Ui_^Bh+e&vKghZD$Np;>6sKJcM8=3|k^2kXjojovn`5@n>t0BM5T6XZY!k<+IIw@l*BNZ47z3?-R} z$rJSSN3!YCQb`grM}B^zuB%(He4eeLGJOCCBN8= z=CEs0&lryQSv8#*o>5@rFNz!)Hb3sR@e_{qIICP1sQ6p)_LLU+f+Tl%2CM@ITBu7i znCV%x>{nx++1HDZ0k{B0W+v6UeS`DnI}|GJ=Ri5lK<@mhU*bxP+t!*DzU$%#j(`vn z={fjwT-v{{JH2%kU`Z5dp0O}giC7>jRFC-0D&JT9;rkSss2CU>zRp7qkOM48PR$WbCN&* z95Yp?0pH}dmjO^%sNzI&FR<7+<&SRygDwqLp z-J7XmD=}v%rYRDAunf~vvCTM+Xr#gz&9kz73Vr(phDE!^2(dQIlI( z4Ij$<3GBay;>p15hr?#+19^JI>U>Vwy+xs?jW?bNi~KUyzIY4IcQH0xiOa$(U*o-v z?E*e)>|2m0vmQTOrUZo$2(9Q#Rk%t_?veN(X+BX@C&k_yjHvvO%|Ig&9N0{}IgBIj zE@!%e9e|4JXUYM%u^Z{<(%2N~2BWL0M|Px7>QC)}hkB=4n3Eb*s;|H=6|HYt?j630 zb2XlC$i;JMR-9|u5{xKaSLB%9h*$enm(~!2uG%T>#Ls6mIQi(u5x*Tz-4 z02w)adW{%o^=HgUB~zs95ta1SpQzgG7WY=?;mV6_rPTy^Lz6!Izrt}d0-6gX%@s@C zS7my5A1g0P)n48{cVHa!1w@zzM=Ae!E^03AN9E4~z zB23U9oU`6+OXdeUPDUp0{9k6vauYkXhT5Pn+6uRlupmBU&XJa4H^(R2?o5z6JYisQ zy(+0X2UgPHtIZi&^d{XK&3n=;=IzLw9L!+lp54U{fAW#eR(^6cIdtpUP=4zj0!I{x zUYdcpyRBtU+r7Wpr-IT@j1e~Zq8_fo~|*l zDbPq5GEr}I^;9WRc3`q@s0r#v}o&dGmX zf=vz8OrA>is|#@w2`z>HEGymiWz>_6`%}#!jjgPP*m1UbzF|XA1Fj)i50s=NW-1Vj zO^1SBj$>UpNE93f{>q}~%)&-ATSl&^hn-9Pqo4=?JY%%U`MGLa$)tEi7>)3Y_sD>mOA6+QWzrDZBZ` zkjA)k2Pm&n!Z`P5ClwdlD(jCVodR+%MWvEPX7xtz<41_XVB)-*aiC!SzzE84xp z|I!Pzt!$>s4UmWNd%E|y1botDLG5~3f)C>yN*{haVOp&()g zWTxLNJ;`+UEWU#EKIR1J6bn!J3&lGu!Au3{f8XW}t{S&M&4&`}tQmMDINU9}u`NAi zmklH6KlPFm8(uL%0JP;z^Q&xP9^Jz7EFPAon%fXMZ5!HG$+KORIr^5%swXgB@Zf%e zweOTi!f>XAT~=W1LG!8|>v-s^(As;re7C6C^{DlA0b#M;b}iEOEz(ww)|WQ7_6Y2+ z8zN7GO9sNdGsYW7`LfMEhO^@5sD$+ggw>}bj)o5E+qBJEK#lF~71XN`Vzw;^)Qqs) zmTvQo2lQchltx#jey?a`h$v%{^3}kG7BuZOerYf4A2!jav{NY$g1;$KsC^IzvG;NVU{@$RQ{sh6ogOQ1-`-2z_>sg< z!j7P5cHo?L>C_dQd+9Vy=ugJO9MtUxAG+gaFIw`@vmx@P<82P6PjJGUfy(oXilyl) z^5+UnCa2hmLi`PWk4s{=sM{TxdTuEOLT^F*%`)U}iBgeixW6t=j*SK{p08nR07?3; zs|eE!P`l`+8+60MWOhI+`Z)Tmqghn6!7c^}hygWrpBKctcO%B{cu)xQg1y3{vvU{s ze`jYWi(t8T3yyFT;u;QL0;c1Q*V)R`_-9~Eg> zrb;Bw^3LGWYw{fz`!+-M@8q$c(Uts!;5WH}_o0)joZg$zIbX$p&QUJg-tMrwx-v$N z5wv^Ny+pydmHIXo;a?wQ)-#KL-LmsV)8CDaWiY>_yf`2Q5n<55nZKmVnXzc>=HL8n zHj`D?)%@1XvlhNLO4XS17u8xi6BUvU+5Vp{&O92*zK!EU)-hSfl5CTG3Zt=0mSksU zEHe^=P}b~AXeJ5`HE3kZk|oMA6j`%`@+jFV%P`rB#=gWT>3!vSp7%Yv&wbAK{^N7~ ze)m83xvz76-|O3m@%czuETu7~RIzohrhOT8T25E^#C&mO9WP?69Qqs<7l$jxJ@C*C zHknGiqKmoXO6ez>20PuKr`RlC+dFkCNFcYnt=>)vKd8$^E^fQSNMoBCx;QYzV`Y{P zPX@hfFsN}6!+2I2`TI@PKbbFc7rF~o(IN-le{BO(P}{64XO5q(XfX46;=ObRf^Chf zU}8-5;YOB>;0bB7Cq$RFX9VMBg#*Tf&dXULkm9+Ld~KZ}JgM~4!;Y`BS4j*|=V3=j@mSSo-lkM$&K>Ak#7Yz7szxv|qi&?l^gXjy*W2cC=eb8)f;&X`LPUSLR>dU> z|Ax;C(0u!O4U9drzGa_=U~43X?h%wnD_b-gycJ|BA-VJTHbrG(rdaD1k9QzwrK1YE4*pM?Wg0bWh}*`sewxAsIiTg{T>OIeOt^EI8`iW;4#J za5pdC<|}S$es^GRp#NBi?nbZxHF+-@Ohx>R22l~qqU6zt)%}|if#DYmx?y0*g3M(5 z1>}b~2i%u}=r}$L8otgEA~lTH=tCbHR zinmz62eDJKlYowG^&a&uaSDzgzR0qW;5=u%h@DO*1|?j;cxJ!uPUXW^*Uu%(*Sq0{ zS7>b6h^bFO;y(~GWS4~Vtayj5ynKekM|wrc1`aHxEC2wWlk`%@1ds8G+BZ?){7I)F zpjrzKYv%Ju@0G|uMd{0f%`O;P>scq>;4OXsAPkmEAh9Fq*Czue>DSMv481AZFwN_3 zn{l2(^=D(^`Ri&OgST(p#P156rCLduZ=@#oT zUw*$BTSXPA3#UvwRsBxFA?82K3iM<{!r5=@Fv8JU>9jDm5UJqZts_nT{ud{4L%v+o zx1v5yoP?<>OHdVCY~MT}FNKKYBHze7pvUhDwELw*$9;y+CN4wgTyY|*4JIzM+UQGP zg$KaKV8QZC{9R4BX%s|K(-X~vp8sVm!-EY5ss-k}6L@L$6zDnMBmpaLAO49jcs@CI zgNY0zJpAs6zV%Fuv8>*el6Cho;q)r>vW-kVmOB=hEgyEd+*ALOfVBz72j!x-B@#Jh z`mP*~x;g><9#8D!LE=%WyO_=YV8ad@dVFjt@#UAFZ*(B3olDho~!~ z9<+u|D48zV5EFL=hRW>9>~-h8ayp3sg(<0M^H=cQMg{>@WX{cANIn`E;_3!?4`#jk zO?0%^B@*S&V;|JYv2Kko^+^YZ*kFZ-A7mF^=3!I!WI62|OgzV{b%>P>7pCI5$05)H zz;nDre*rx}@?;Ohizj{XgtYwgv6>m3o5btL)!7d%aZ>E-Vr>~b3$8i{m+1)IKv8NL z*zd|$-y|p57%PxrTn1;xB9olaW^_Bqi3CezKx^G zBfhAhNQpS^nsReua|5frl1|?LSX59iNO*YQrKD#1WWNnef_rwDc2eEK6yaLJ9{;m1>^>r|5)E*x|obSjD@jEqfIgCLRfF z(D*8TX1XlV6?|=0(Yu}9ZNc_}N{^K2gP!s8;TyMd^4F5CzJWn&2aSS)I_90aYw;{E z#_Z~$t~twh2}B{WhvtEP&QkFSk7JO=Nz**{q;<7-p<#rQjxeg|ooVG53hu((7rqZ} zp1?cw)}slIUUqVGLV1NpXlzPNLU{%5-+s8S?Ky%L*<&GnYgbzww=2X-PSkvZ9P2a> z@wG=Xz9sz!K-ay?is(PCQB&$(B#tkO9kH88*u4g5Gu_KEkP^ zCuNki6yDBZ4YEuctH%nBzPifNYOdaVg=SYPOVw}A-;njkh@RW9Ven%zOcUdVb5~YP z%W@;d=XpyfWt9c9>6UDp0O>{+6PL1;p=cQ)$*>Zw0WgFTKg&5(xXxa-EBK8 ze5vxNy;mjt!4HNcqiQdZ`co6dSk#hGXCIp;okQ0sAkCSJ8$Sc<#+SLM69;2EZ=WE< zdBz)-v%b6(FfEdIV+t0j!>0IJf2ok4wUsrB9mp9ixp!J_Q+~~HDz45SyjNP?U+)w= z95&mqyn3B;@O671*UxQ8Uu8%VYU7a*pjlA^@8!)TT{*|sWnCmEt_hSK2@($N6@67e zZFCE8Fbbgatjdf@;6IM#z&(*u)@bB&*7@bFpR9F{YNaVRzo(^t5R=LNC?*}5yR9+! zg+emKcp~`xM)IVa-dwC2&Xc7~SB`ipaXXc_nAF-tY4$S&{y@ECiC3iGB{CmpJ*4 zujbFPLxUHGcGeTwFN2a45RijcJY=6d1iqH~2jnD`Aovd8KYc#`^2IR$&;$4g@^A3a zamK&Yz81$kRow^WNzO>#gB5?b8Gm;f0D%4>(9~!jL>xdgLgu4;tN_4c9suCXAqZi) n4@rQFzFTw${76n(TtN9zzY!A?_fC4zia*rjDpSJ delta 17142 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 JTKRzV000Su*yjKM diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.md5 b/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.md5 index e99827a..ddf060b 100644 --- a/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.md5 +++ b/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.md5 @@ -1 +1 @@ -ed7bf432cc57babf03a25c5a0ff95abc \ No newline at end of file +eb035af7c6ce60caf3ab9c762a96e98d \ No newline at end of file diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.sha1 b/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.sha1 index 8fb19c5..bb30c42 100644 --- a/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.sha1 +++ b/localRepo/top/niunaijun/blackobfuscator/plugin/1.0.0/plugin-1.0.0.jar.sha1 @@ -1 +1 @@ -803f254bf5ef5711f0f6cf94f55b1237d3f8e7c8 \ No newline at end of file +eaab39a87530bce1ff233150bed9bd1c786c64d1 \ No newline at end of file diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml index 37cf149..39d1a89 100644 --- a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml +++ b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml @@ -7,6 +7,6 @@ 1.0.0 - 20220111141950 + 20220113045741 diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.md5 b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.md5 index 74dced5..3dfae95 100644 --- a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.md5 +++ b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.md5 @@ -1 +1 @@ -ab00298c03962a3ffdc635a350badc08 \ No newline at end of file +a4e0ad7fcf21d4047bf1348dbbbeae58 \ No newline at end of file diff --git a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.sha1 b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.sha1 index ec1609a..fd40176 100644 --- a/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.sha1 +++ b/localRepo/top/niunaijun/blackobfuscator/plugin/maven-metadata.xml.sha1 @@ -1 +1 @@ -5472636145974a6e10fa5af7b149bed773731c73 \ No newline at end of file +ef65fe9ba949d79e0d61ed67e5197027f3a5221b \ No newline at end of file diff --git a/plugin/src/main/groovy/top/niunaijun/blackobfuscator/ObfPlugin.groovy b/plugin/src/main/groovy/top/niunaijun/blackobfuscator/ObfPlugin.groovy index 4d6e92d..17ebb81 100644 --- a/plugin/src/main/groovy/top/niunaijun/blackobfuscator/ObfPlugin.groovy +++ b/plugin/src/main/groovy/top/niunaijun/blackobfuscator/ObfPlugin.groovy @@ -2,6 +2,7 @@ package top.niunaijun.blackobfuscator import com.android.build.gradle.AppExtension import com.android.build.gradle.api.ApplicationVariant +import com.android.build.gradle.internal.api.ReadOnlyProductFlavor import com.android.build.gradle.internal.dsl.BuildType import com.android.build.gradle.internal.dsl.ProductFlavor import com.android.build.gradle.internal.tasks.DexMergingTask @@ -13,6 +14,7 @@ public class ObfPlugin implements Plugin { private String PLUGIN_NAME = "BlackObfuscator" private Project mProject public static BlackObfuscatorExtension sObfuscatorExtension + public Map mTaskMapping = new HashMap<>() void apply(Project project) { this.mProject = project @@ -20,6 +22,7 @@ public class ObfPlugin implements Plugin { project.configurations.create(PLUGIN_NAME).extendsFrom(project.configurations.implementation) sObfuscatorExtension = project.extensions.create(PLUGIN_NAME, BlackObfuscatorExtension, project) + mTaskMapping.clear() project.afterEvaluate { System.out.println("=====BlackObfuscator=====") System.out.println(sObfuscatorExtension.toString()) @@ -36,46 +39,36 @@ public class ObfPlugin implements Plugin { task.getOutputs().getFiles().collect().each() { element -> def file = new File(element.toString()) ObfDex.obf(file.getAbsolutePath(), - sObfuscatorExtension.depth, sObfuscatorExtension.obfClass, sObfuscatorExtension.blackClass) + sObfuscatorExtension.depth, + sObfuscatorExtension.obfClass, + sObfuscatorExtension.blackClass, + mTaskMapping.get(task.name)) } } } List tasks = new ArrayList<>() - addTask("mergeDexRelease", tasks) - addTask("mergeDexDebug", tasks) - addTask("mergeLibDexDebug", tasks) - addTask("mergeProjectDexDebug", tasks) - addTask("transformDexArchiveWithDexMergerForDebug", tasks) - addTask("transformDexArchiveWithDexMergerForRelease", tasks) - addTask("minifyReleaseWithR8", tasks) - addTask("minifyDebugWithR8", tasks) - - List buildTypes = new ArrayList<>() - List productFlavors = new ArrayList<>() if (android != null) { android.applicationVariants.all(new Action() { @Override void execute(ApplicationVariant applicationVariant) { - def name = upperCaseFirst(applicationVariant.buildType.name) - buildTypes.add(name) - } - }) - android.productFlavors.all(new Action() { - @Override - void execute(ProductFlavor productFlavor) { - def name = upperCaseFirst(productFlavor.name) - productFlavors.add(name) + File mappingFile = null + if (applicationVariant.buildType.minifyEnabled) { + mappingFile = applicationVariant.mappingFile + } + def buildType = upperCaseFirst(applicationVariant.buildType.name) + boolean empty = true + for (ReadOnlyProductFlavor flavor : applicationVariant.productFlavors) { + def flavorName = upperCaseFirst(flavor.name) + addOtherTask(tasks, flavorName, buildType, mappingFile) + empty = false + } + if (empty) { + addOtherTask(tasks, "", buildType, mappingFile) + } } }) } - for (String buildType : buildTypes) { - for (String product : productFlavors) { - addOtherTask(tasks, product, buildType) - } - addOtherTask(tasks, "", buildType) - } - for (Task task : tasks) { task.doLast(action) } @@ -85,26 +78,29 @@ public class ObfPlugin implements Plugin { } } - private void addOtherTask(List tasks, String name, String buildType) { - addTask("mergeDex${name}${buildType}", tasks) - addTask("mergeLibDex${name}${buildType}", tasks) - addTask("mergeProjectDex${name}${buildType}", tasks) - addTask("transformDexArchiveWithDexMergerFor${name}${buildType}", tasks) - addTask("minify${name}${buildType}WithR8", tasks) + private void addOtherTask(List tasks, String name, String buildType, File mappingFile) { + addTask("mergeDex${name}${buildType}", tasks, mappingFile) + addTask("mergeLibDex${name}${buildType}", tasks, mappingFile) + addTask("mergeProjectDex${name}${buildType}", tasks, mappingFile) + addTask("transformDexArchiveWithDexMergerFor${name}${buildType}", tasks, mappingFile) + addTask("minify${name}${buildType}WithR8", tasks, mappingFile) + + println("$name$buildType mappingFile $mappingFile") } private String upperCaseFirst(String val) { - char[] arr = val.toCharArray(); - arr[0] = Character.toUpperCase(arr[0]); - return new String(arr); + char[] arr = val.toCharArray() + arr[0] = Character.toUpperCase(arr[0]) + return new String(arr) } - private void addTask(String name, List tasks) { + private void addTask(String name, List tasks, File mappingFile) { try { //Protected code Task task = mProject.tasks.getByName(name) if (!tasks.contains(task)) { tasks.add(task) + mTaskMapping.put(task.name, mappingFile.absolutePath) println("add Task $name") } } catch(UnknownTaskException e1) { diff --git a/plugin/src/main/java/top/niunaijun/blackobfuscator/core/Mapping.java b/plugin/src/main/java/top/niunaijun/blackobfuscator/core/Mapping.java new file mode 100644 index 0000000..182d6c1 --- /dev/null +++ b/plugin/src/main/java/top/niunaijun/blackobfuscator/core/Mapping.java @@ -0,0 +1,58 @@ +package top.niunaijun.blackobfuscator.core; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Milk on 2022/1/12. + * * ∧_∧ + * (`・ω・∥ + * 丶 つ0 + * しーJ + * 此处无Bug + */ +public class Mapping { + private File mFile; + private final Map mapping = new HashMap<>(); + + public Mapping(String file) { + if (file == null) + return; + mFile = new File(file); + parser(); + } + + private void parser() { + if (mFile == null || !mFile.exists()) + return; + try { + List strings = FileUtils.readLines(mFile, Charset.defaultCharset()); + for (String string : strings) { + if (string.startsWith("#") || string.startsWith(" ")) { + continue; + } + String[] split = string.split(" -> "); + if (split.length != 2) { + continue; + } +// System.out.println("add mapping : " + string); + mapping.put(split[0], split[1].substring(0, split[1].length() - 1)); + } + } catch (IOException ignored) { + } + } + + public String get(String origClazz) { + return mapping.get(origClazz); + } + + public Map getMapping() { + return mapping; + } +} diff --git a/plugin/src/main/java/top/niunaijun/blackobfuscator/core/ObfDex.java b/plugin/src/main/java/top/niunaijun/blackobfuscator/core/ObfDex.java index 2365ecc..a2d5761 100644 --- a/plugin/src/main/java/top/niunaijun/blackobfuscator/core/ObfDex.java +++ b/plugin/src/main/java/top/niunaijun/blackobfuscator/core/ObfDex.java @@ -4,9 +4,12 @@ import com.googlecode.dex2jar.tools.Jar2Dex; import org.jf.DexLib2Utils; +import org.jf.util.TrieTree; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import top.niunaijun.obfuscator.ObfuscatorConfiguration; @@ -19,25 +22,26 @@ * 此处无Bug */ public class ObfDex { - public static void obf(String dir, int depth, String[] obfClass, String[] blackClass) { + public static void obf(String dir, int depth, String[] obfClass, String[] blackClass, String mappingFile) { File file = new File(dir); + Mapping mapping = new Mapping(mappingFile); if (file.isDirectory()) { File[] files = file.listFiles(); if (files == null) return; for (File input : files) { if (input.isFile()) { - handleDex(input, depth, obfClass, blackClass); + handleDex(input, depth, obfClass, blackClass, mapping); } else { - obf(input.getAbsolutePath(), depth, obfClass, blackClass); + obf(input.getAbsolutePath(), depth, obfClass, blackClass, mappingFile); } } } else { - handleDex(file, depth, obfClass, blackClass); + handleDex(file, depth, obfClass, blackClass, mapping); } } - private static void handleDex(File input, int depth, String[] obfClass, String[] blackClass) { + private static void handleDex(File input, int depth, String[] obfClass, String[] blackClass, Mapping mapping) { if (!input.getAbsolutePath().endsWith(".dex")) return; File tempJar = null; @@ -47,7 +51,34 @@ private static void handleDex(File input, int depth, String[] obfClass, String[] tempJar = new File(input.getParent(), System.currentTimeMillis() + "obf" + input.getName() + ".jar"); splitDex = new File(input.getParent(), System.currentTimeMillis() + "split" + input.getName() + ".dex"); obfDex = new File(input.getParent(), System.currentTimeMillis() + "obf" + input.getName() + ".dex"); - long l = DexLib2Utils.splitDex(input, splitDex, Arrays.asList(obfClass), Arrays.asList(blackClass)); + List obfClassList = arrayToList(obfClass); + List blackClassList = arrayToList(blackClass); + + TrieTree whiteListTree = new TrieTree(); + whiteListTree.addAll(obfClassList); + + for (String aClass : mapping.getMapping().keySet()) { + if (whiteListTree.search(aClass)) { + String orig = mapping.get(aClass); + if (orig != null) { + System.out.println("mapping : " + aClass + " ---> " + orig); + obfClassList.add(orig); + } + } + } + + TrieTree blackListTree = new TrieTree(); + blackListTree.addAll(blackClassList); + for (String aClass : blackClassList) { + if (blackListTree.search(aClass)) { + String orig = mapping.get(aClass); + if (orig != null) { + System.out.println("mapping : " + aClass + " ---> " + orig); + blackClassList.add(orig); + } + } + } + long l = DexLib2Utils.splitDex(input, splitDex, obfClassList, blackClassList); if (l <= 0) { System.out.println("Obfuscator Class not found"); return; @@ -75,4 +106,9 @@ public boolean accept(String className, String methodName) { obfDex.delete(); } } + + private static List arrayToList(String[] array) { + List list = Arrays.asList(array); + return new ArrayList<>(list); + } }