官網介紹:https://www.guardsquare.com/en/proguard/manual/introduction
android 開發文檔:https://developer.android.com/studio/build/shrink-code.html
1.混淆的基本原理
android平台的混淆原理簡單來說就是把代碼中原來有具體含義的包名,類名,變量名,方法名等名稱全部替換成按順序排列的無意義的英文字母a、b、c….這樣代碼結構沒有變化,還可以運行得到一樣的結果,並且就算代碼被反編譯出來,別人很難弄懂代碼的架構和具體意思。
2.混淆步驟
混淆過程:
- 壓縮(Shrink):偵測並移除代碼中無用的類、字段、方法、和特性(Attribute)。
- 優化(OPtimize):對字節碼進行優化,移除無用指令。
- 混淆(Obfuscate):使用a、b、c、d這樣簡短而無意義的名稱,對類、字段和方法進行重命名。
- 預檢(Preveirfy): 在java平台上對處理后的代碼進行預檢,確保加載的class文件是可執行的。。
a.打開
minifyEnabled 為true
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
b.android studio 中自定義文件
sdk中tool里面proguard-android.txt
在文件 工程\app\proguard-rules.pro中自定義。
不混淆 ScrollView類中自定義的public print函數
-keepclassmembers class com.example.zcx.democoderjoy.ScrollViewActi {
public *;
}
效果:增加之前反編譯:
家之后效果:
發現增加了print函數,並沒有被混淆。
常見的參數:
-keep 指定類和類成員(變量和方法)不被混淆。
-keepclassmembers 指定類成員不被混淆(就是-keep的縮小版,不管類名了)。
-keepclasseswithmembers 指定類和類成員不被混淆,前提是指定的類成員存在
-keep
-keep public class * extends android.support.v4.**
-keepclassmembers
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
c.每次構建時 ProGuard 都會輸出下列文件:
-
dump.txt
- 說明 APK 中所有類文件的內部結構。
-
mapping.txt
- 提供原始與混淆過的類、方法和字段名稱之間的轉換。
-
seeds.txt
- 列出未進行混淆的類和成員。
-
usage.txt
- 列出從 APK 移除的代碼。
這些文件保存在 <module-name>/build/outputs/mapping/release/
中
3.混淆優缺點
混淆的優點主要兩個:1.優化刪除無用代碼,減少apk的體積。2.混淆代碼讓其反編譯之后,無法理解具體內容。
缺點:調試不方便(可以使用mapping.txt),測試不充分可能導致部分功能不能使用。
4.通用使用下面這些通配符來匹配:
1) % :匹配任何原始類型,如 boolean 、 int 等,但不包括 void ;
2) ? :匹配一個任意字符,不包括句號;
3) * :匹配任意個任意字符,不包括句號;
4) ** :匹配任意個任意字符,包括句號;
5) *** :匹配任意類型,包括原始類型和非原始類型,數組類型和非數組類型;
6) … :匹配任何數目個任何類型的參數。