ProGuard工具通過移除不用的代碼,用語義上混淆的名字來重命名類、字段和方法等手段來壓縮、優化和混淆你的代碼。結果是更小的.apk文件,並且更難於被反編譯。由於ProGuard能夠讓你的程序難於被反編譯,因此,當你的程序使用了一些機密的信息的時,使用它就顯得更加重要。
ProGuard已經集成到Android的編譯環境中,因此,用不著手動來觸發它。ProGuard只在release模式下編譯應用程序才會運行,所以,在debug模式下編譯,你就不必處理混淆的代碼。是否運行ProGuard是完全可選的,但強烈推薦使用。
啟用ProGuard
當你創建Android工程時,proguard.cfg文件會在工程的根目錄自動創建。這個文件定義了ProGuard如何優化和混淆代碼,因此,理解如何定制它是非常重要的。默認的配置文件只是覆蓋了一些通用的情況,所以,基本上你需要編輯它來滿足你的需求。參考後面的“配置ProGuard”章節來了解如何定制ProGuard的相關信息。
啟用ProGuard讓它跟隨Ant或Eclipse編譯時一起運行,你需要在<project_root>/default.properties文件中設置proguard.config屬性。路徑可以是絕對路徑或是工程根目錄的相對路徑。 如果你把proguard.cfg文件放在默認的位置(工程的根目錄),你可以像這樣來指定它的位置: proguard.config=proguard.cfg
你還可以把該文件移到任何你想放的位置,然後指定絕對路徑:proguard.config=/path/to/proguard.cfg
當你在release模式下編譯你的程序,不管是用ant release還是用Eclipse的導出向導,編譯系統都會自動檢查proguard.config屬性是否設置。如果設置了,ProGuard就會在打包成.apk文件之前,自動處理應用程序的字節碼。Debug模式編譯,不會觸發ProGuard,因為它會使得調試更加復雜累贅。
ProGuard運行結束後,輸出以下文件: dump.txt
描述.apk文件中所有類文件間的內部結構
mapping.txt
列出了原始的類,方法和字段名與混淆後代碼間的映射。這個文件很重要,當你從release版本中收到一個bug報告時,可以用它來翻譯被混淆的代碼。
seeds.txt
列出了未被混淆的類和成員
usage.txt
列出了從.apk中刪除的代碼
這些文件放在以下文件夾中:
Ant:<project_root>/bin/proguard
Eclipse: <project_root>/proguard
注意:每當你在release模式下編譯時,這些文件都會被覆蓋重寫,當然,是被ProGuard工具生成的最新的文件所覆蓋。每次你發布你的程序時,都應該保存一份,為了將來能夠解碼bug報告。
配置 ProGuard
一些情況下,proguard.cfg文件中的默認配置就足夠了。然而,有些情況ProGuard也很難正確分析,它可能會刪除它認為不用的代碼,但實際上正是你的程序所需要的。例如:
只在AndroidManifest.xml文件中引用的類
由JNI調用的方法
動態引用的字段和方法
默認的proguard.cfg文件努力去覆蓋通用的情況,但有可能你會遇到如ClassNotFoundException這樣的異常,而這正好是由於ProGuard移除了整個類造成的。
你可以修正由於ProGuard移除代碼造成的錯誤,只需要在proguard.cfg文件中添加一行“-keep”。例如:
-keep public class <MyClass>
使用-keep選項時,有一些選項和建議,因此,強烈建議你閱讀ProGuard手冊來了解更多關於定制配置文件的信息。“Overview of Keep options”和“Examples section”將非常有用。
ProGuard 的詳細介紹:請點這裡
ProGuard 的下載地址:請點這裡
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11