Android 混淆總結(jié)

https://blog.csdn.net/u011732740/article/details/51545722

  1. 混淆后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)合并后接口的所有方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 混淆(Proguard)用法 最近項(xiàng)目中遇到一些混淆相關(guān)的問(wèn)題,由于之前對(duì)proguard了解不多,所以每次都是面...
    于曉飛93閱讀 57,153評(píng)論 38 230
  • Proguard 混淆工具來(lái)幫助我們快速地對(duì)代碼進(jìn)行混淆。根據(jù) Java 官方介紹,Proguard 對(duì)應(yīng)的具體中...
    獨(dú)自闖天涯的碼農(nóng)閱讀 6,124評(píng)論 0 7
  • 最近在研究apk瘦身時(shí),發(fā)現(xiàn)代碼混淆有很大作用,所以就去簡(jiǎn)單研究了一下。 我認(rèn)為,代碼混淆可以保護(hù)核心功能不泄漏以...
    i小灰閱讀 6,302評(píng)論 2 12
  • 在了解混淆之前,先來(lái)了解一下反編譯。 反編譯 Android程序打完包之后得到的是一個(gè)APK文件,這個(gè)文件是可以直...
    聽(tīng)媽媽的話閱讀 644評(píng)論 0 0
  • 如何開(kāi)啟混淆 eclipse 只需要在工程中找到projiect.properties文件,在這個(gè)文件中修改下面一...
    mymdeep閱讀 440評(píng)論 0 1

友情鏈接更多精彩內(nèi)容