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”將非常有用。

 

 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()