https://blog.csdn.net/u011732740/article/details/51545722
-
混淆后App Crash日志定位問(wèn)題
混淆代碼錯(cuò)誤信息.png
2.1、常用命令
命令 作用
-keep 防止該類所有內(nèi)容被移除或重命名
-keepnames 防止類和成員被重命名
-keepclassmembers 防止成員被移除或者被重命名
-keepclasseswithmembers 防止擁有該成員的類和成員被移除或者被重命名
-keepclasseswithmembernames 防止擁有該成員的類和成員被重命名
2.2. 常用規(guī)則
類:需要使用完全限定名;
*:通配符,任意字符串,不包含包名分隔符(.);
**:通配符,任意字符串,包含包名分隔符(.);
extends:繼承某類的類;
implement:實(shí)現(xiàn)某接口的類;
$:內(nèi)部類;
<init>:所有構(gòu)造方法;
<fields>:所有成員變量;
<methods>:所有方法;
…:任意參數(shù);
修飾符:public private protected
2.3. 例子
含義 指令語(yǔ)句
不混淆某個(gè)類 -keep public class packageName.className{ ; }
不混淆某個(gè)包的所有類 -keep class packageName.*{ *; }
不混淆某個(gè)類的子類 -keep public class * extends packageName.className{ *; }
不混淆某個(gè)接口的子類 -keep public class * implements packageName.className{ *; }
不混淆某個(gè)類的構(gòu)造方法
-keepclassmembers class packageName.className{
public <init>(org.json.JSONObject);
}
不混淆某個(gè)類的某個(gè)方法 -keepclassmembers class packageName.className{ public void methodName(…); }
不混淆某個(gè)類的內(nèi)部類 -keep class packageName.className$*{ *; }
混淆的步驟
上文中介紹了代碼的混淆,其實(shí)Android的混淆中還包括了資源壓縮,整個(gè)過(guò)程包括:壓縮、優(yōu)化、混淆、以及預(yù)校驗(yàn),其中第四步在Android中可不要,默認(rèn)是去掉了的,另外三個(gè)都是默認(rèn)開(kāi)啟的。
壓縮:會(huì)移除未被使用的類和成員變量,會(huì)在優(yōu)化后再次被執(zhí)行;
優(yōu)化:在字節(jié)碼級(jí)別執(zhí)行優(yōu)化,讓?xiě)?yīng)用運(yùn)行的更快;
混淆:增大反編譯難度,類和類成員會(huì)被隨機(jī)命名,除非用keep保護(hù)。
Shrinking Options 壓縮選項(xiàng)
shrink,測(cè)試后發(fā)現(xiàn)會(huì)將一些無(wú)效代碼給移除,即沒(méi)有被顯示調(diào)用的代碼
-dontshrink
shrink操作默認(rèn)啟用,每個(gè)optimization步驟后,都會(huì)執(zhí)行一步shrink。
該選項(xiàng) 表示 不啟用 shrink。
測(cè)試后發(fā)現(xiàn)是全局性的,且即便使用了-keep 開(kāi)啟shrink,也無(wú)效
-printusage [filename]
打印被移除的代碼,在標(biāo)準(zhǔn)輸出
-whyareyoukeeping class_specification
打印 在shrink過(guò)程中 為什么有些代碼被 keep
Optimization Options 優(yōu)化選項(xiàng)
基于控制流、數(shù)據(jù)流分析后,刪除、合并一些代碼
-dontoptimize
optimization,默認(rèn)啟用
該選項(xiàng)表示 不啟用
當(dāng)不使用該選項(xiàng)時(shí),下面的才有效
-optimizations optimization_filter
根據(jù)optimization_filter指定要優(yōu)化的文件
-optimizationpasses n
優(yōu)化數(shù)量 n
-assumenosideeffects class_specification
如果一個(gè)方法有返回值,在調(diào)用的時(shí)候沒(méi)使用到它的返回值,那么可能被忽略。
-allowaccessmodification
優(yōu)化時(shí)允許訪問(wèn)并修改類和類的成員的 訪問(wèn)修飾符,可能作用域會(huì)變大。
-mergeinterfacesaggressively
竭力合并接口,即使它們的實(shí)現(xiàn)類未實(shí)現(xiàn)合并后接口的所有方法。
