android 混淆基本知識


官網介紹: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) … :匹配任何數目個任何類型的參數。

 參考鏈接:http://www.chenglong.ren/2016/10/21/android%E4%B8%AD%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM