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