Android混淆心得

2021-08-15 00:14:36 字數 2836 閱讀 1839

最近在做android應用的混淆,踩了一些坑,這裡記錄分享下個人的心得。

首先先簡單說一下什麼是混淆和混淆的作用,其實這個搜尋下可以找到一堆官方的說法等等,這裡簡單口語敘述一下,混淆就是把**替換成a、b、c基本字母組成的**,比如乙個方法名為:function(),混淆後可能會被替換成a()。

混淆的好處:

前者只能說有一點作用,後者則需要看**的數量

當然不能忽視混淆的缺點:

混淆在android studio的專案中預設是關閉的,其中控制開關和規則配置檔案分別由專案moudle中的build.gradleproguard-rules.pro控制,如下圖所示:

其中build.gradle中

buildtypes 

}

其中

minifyenabled false
表示不開啟混淆,可以改為

minifyenabled true
開啟混淆,開啟混淆後可以新增一句:

shrinkresources true
表示去掉沒有引用的資源,可以減少應用的體積,但這個只有在混淆開啟後才有效。

可以從上述的**看出,android自帶乙個混淆規則檔案:

proguard-android.txt
這個檔案在sdk目錄下,裡面有一些預設自帶的規則,而我們今天需要配置的自定義配置的檔案,即上面所述的

proguard-rules.pro
混淆檔案採用白名單法,意思是不在白名單裡面的都要混淆。

混淆規則的基本符號:

# 代表行注釋符

- 表示一條規則的開始

一般規則用連起來單詞表示,主要有:

keep 保留,例如keepattributes:表示保留屬性

dont 不要,例如dontwarn:表示不要提示警告

ignore 忽略,例如ignorewarning:表示忽略警告

混淆配置檔案不檢查規則是否重複,如果兩條規則衝突,則採用白名單的,比如設定了開啟優化和不優化兩個選項後,無論順序,最終都會執行不優化的操作。

這個是用於控制混淆是否開啟優化**,例如一些if/else語句可以被簡化等這些操作:

# 不優化

-dontoptimize

# **迴圈優化次數,0-7,預設為5

-optimizationpasses 5

值得注意的是預設混淆配置檔案開啟了-dontoptimize

開啟優化後可以設定下面的規則,assumenosideeffects表示指定的**無效,可以優化,最終效果表現為不執行。

# 混淆時所採用的優化規則

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# 關閉log

-assumenosideeffects class android.util.log

下面這些一般混淆規則都要加入,其中前兩個在預設檔案中已經配置:

# 包名不使用大小寫混合 aa aa

-dontusemixedcaseclassnames

# 不混淆第三方引用的庫

-dontskipnonpubliclibraryclasses

# 不做預校驗

-dontpreverify

# 忽略警告

-ignorewarning

# 混淆後生產對映檔案 map 類名->轉化後類名的對映

-verbose

# 混淆前後的對映

# apk 包內所有 class 的內部結構

-dump class_files.txt

# 未混淆的類和成員

-printseeds seeds.txt

# 列出從 apk 中刪除的**

-printusage unused.txt

如果混淆後報錯,通過retrace後找到錯誤的問題後可以直接編寫規則來去掉混淆,但是如果報的錯誤莫名其妙,而且報錯的類沒有混淆,那麼你可以採用極端的方法:

加入下面規則:

-keep class *.**
這條規則表示不混淆所有類及其中所有**,加了這條規則之後,

還不能執行表示是其他問題,例如註解,內部類等等,

可以執行後,可以通過反編譯,尋找所有包名,記錄下來,把上述規則改為:

-keep class

android.**

-keep class

com.**

-keep class

io.**

-keep class

org.**

...

乙個個去掉檢查是否有報錯,例如查到

-keep class

com.**

加了就不報錯,則可以繼續一級級往下檢查。

但要注意,有時候可能是幾個包混合問題。

有任何錯誤、疑問或者建議,歡迎指出。

關於android混淆

android studio新增混淆 1,在build.grandle新增,其中規則寫在proguard rules.pro中,也可以自定義乙個檔案,將其代替,比如eclipse常用的 proguard project.txt buildtypes 2,在proguard rules.pro中加入以...

Android混淆問題

解決方法 本選項的作用 指定的jar會被打包,但是不會被混淆 jar的依賴一樣會被混淆,依然會檢查引用的類 方法 字段 解決方法 keepattributes signature 解決方法 對於proguard,不要使用keepresourcexmlelements選項 原因 出錯的行 keepcl...

android混淆配置

xtuils3 配置 optimizationpasses 5 混淆時不會產生形形色色的類名 dontusemixedcaseclassnames 指定不去忽略非公共的類庫 dontskipnonpubliclibraryclasses 不預校驗 dontpreverify verbose 優化 o...