混淆工程如果不保留行號,則查起Crash時,一一對照mapping文件是非常麻煩的,而且由於java的全名規範,只要方法的參數不一致,即可方法名相同,在這種情況下,更難準確定位出錯的方法及具體的代碼。
如下圖,同一個類中被混淆後有三個名字爲 a
的方法:
解決辦法爲:混淆時保留行號;
具體操作是在工程的proguard-project.txt
中添加如下配置:
# 將.class信息中的類名重新定義爲"Proguard"字符串
-renamesourcefileattribute Proguard
# 並保留源文件名爲"Proguard"字符串,而非原始的類名 並保留行號
-keepattributes SourceFile,LineNumberTable
下圖圖1,未混淆的crash異常棧,保留了最完整的信息至於爲什麼要如上配置,請看下面四張圖吧。
下圖圖2,在混淆操作下,只配置-keepattributes LineNumberTable
並未真的保留行號
下圖圖3,在混淆操作下,不但保留了行號,還把類名給打印出來了,我們希望把類名也隱藏起來,效果見圖4.
下圖圖4,混淆操作下,類名也被”Proguard”代替了,很好很好..
後記:
dump.txt mapping.txt seeds.txt usage.txt含義
混淆後在工作區的項目文件夾下會生成一個proguard文件,其中:
dump.txt 描述了apk文件中所有類的結構。
mapping.txt 列出了源碼與混淆後的,類,方法,字段的名稱映射。當你從發佈項目中收到Bug報告時(大體意思應該是,用手機連接到Eclipse調試混淆後的軟件時,爲了正確的輸出日誌會用到這個映射文件),這個文件時很重要的。因爲需要翻譯混淆堆棧跟蹤後的類名、方法、字段的名稱(這些是源碼中真正的名稱)。
seeds.txt 列出沒有混淆的類和成員。
usage.txt 列出了從apk文件中剝離的代碼。
proguard examples
推薦一個progard的學習鏈接:Progaurd Examples