最近在做android應用的混淆,踩了一些坑,這裡記錄分享下個人的心得。
首先先簡單說一下什麼是混淆和混淆的作用,其實這個搜尋下可以找到一堆官方的說法等等,這裡簡單口語敘述一下,混淆就是把**替換成a、b、c基本字母組成的**,比如乙個方法名為:function(),混淆後可能會被替換成a()。
混淆的好處:
前者只能說有一點作用,後者則需要看**的數量
當然不能忽視混淆的缺點:
混淆在android studio的專案中預設是關閉的,其中控制開關和規則配置檔案分別由專案moudle中的build.gradle和proguard-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...