原文地址:http://blog.csdn.net/forlong401/article/details/23539123.html
http://www.trinea.cn/android/proguard-use/android
本文主要ProGuard的做用、使用及bug分析。
一、ProGuard做用
ProGuard經過刪除無用代碼,將代碼中類名、方法名、屬性名用晦澀難懂的名稱重命名從而達到代碼混淆、壓縮和優化的功能,跟JavaScript的混淆壓縮相似。
壓縮和優化使得編譯後apk包更小。
混淆能夠保證代碼在被反編譯後讀懂的難度很大,防止逆向工程。這點也是咱們在應用發佈前須要ProGuard的一大緣由。app
二、ProGuard的使用
(1). 系統應用:
在項目根目錄下的Android.mk文件中添加eclipse
這樣應用不須要單獨設置proguard配置文件,在系統編譯時會採用系通通一的proguard.cfg對該應用進行proguard,系統proguard.cfg位於系統根目錄\build\core內。ide
(2). 非系統應用:
a. 打開ProGuard開關
在項目根目錄下的project.properties文件中配置proguard,添加以下代碼:性能
這樣在release模式下打包apk以前,proguard會以proguard.cfg爲規則處理應用字節碼。關於release模式下面第c部分會進行介紹優化
b. 編寫本身的proguard config文件
默認會對全部代碼混淆,若是須要部分混淆,能夠本身修改proguard.cfg文件
關於proguard config的語法及標準配置可見:Proguard語法及經常使用proguard.cfg代碼段ui
注意下列類不能進行混淆:
(1)、反射用到的類
(2)、在AndroidManifest中配置的類(Activity、Service等的子類及Framework類默認不會進行混淆)
(3)、Jni中調用的類spa
c. 運行ProGuard及其生成的文件介紹
在以release模式下打包apk時會自動運行ProGuard,這裏的release模式指的是經過ant release命令或eclipse project->android tools->export signed(unsigned) application package生成apk。在debug模式下爲了更快調試並不會調用proguard。.net
若是是ant命令打包apk,proguard信息文件會保存於<project_root>/bin/proguard文件夾內;如 果用eclipse export命令打包,會在<project_root>/proguard文件夾內。其中包含如下文件:
mapping.txt表示混淆先後代碼的對照表,這個文件很是重要。若是你的代碼混淆後會產生bug的話,log提示中是混淆後的代碼,但願定位到源代碼的話就能夠根據mapping.txt反推。
dump.txt描述apk內全部class文件的內部結構
seeds.txt列出了沒有被混淆的類和成員
usage.txt列出了源代碼中被刪除在apk中不存在的代碼
下圖爲mapping.txt部份內容,以及混淆先後的代碼對比:
從中能夠看出混淆後代碼大多abcdefg..
注意:養成保存mapping.txt的習慣。ProGuard會在每次運行時覆蓋原來的文件,因此每次發佈請保存mapping.txt,方便該版本出現問題時調出日誌進行排查。mapping.txt能夠根據版本號或是發佈時間命名來保存或是放進代碼版本控制中。
d. ProGuard是否成功檢查
能夠經過反編譯Apk檢查proguard是否成功,若是成功代碼會相似上面的截圖,大部分類名及成員名都是形如a.b.c…。關於反編譯請參考:Android Apk 反編譯
三、ProGuard混淆後bug分析
(1) 代碼自己bug
混淆後bug提示信息中代碼都是混淆後代碼,類a. b. c…,若是須要排查,就得根據mapping.txt文件去反推實際代碼中對應的代碼段從而解決問題
PS:混淆後代碼中的$表示匿名內部類,根據代碼中順序依次爲OutClassName$1, OutClassName$2
(2) 因混淆而產生的bug
應用可能會由於ProGuard混淆了不應混淆的代碼而產生一些bug,其中最多見的就是ClassNotFoundException,還有BadParcelableException等
對於ClassNotFoundException,根據mapping.txt文件反推找到某個類,而後在proguard.cfg中不進行混淆便可
對於android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR,proguard.cfg中添加
對於android.support.v4 can’t find superclass or interface,can’t find referenced method,proguard.cfg中添加
proguard混淆後其餘問題可見:http://proguard.sourceforge.net/index.html#manual/troubleshooting.html
Proguard語法及經常使用proguard.cfg代碼段