Android Developers:ProGuard,androidproguard
ProGuard工具通過刪除未使用的代碼,使用語義模糊的名字重新命名類、欄位和方法的方式,減少、最佳化和混淆你的代碼。結果產生一個更小的,更難被反向工程的.apk檔案。因為ProGuard使你的應用程式更難反向工程,當你發布的應用程式使用對安全敏感功能的時候,使用它尤為重要。
ProGuard已經被整合到Android的構建系統中,所以你不需要手動的調用它。ProGuard僅僅當你在release模式構建你的應用程式時運行,所以你不需要在Debug模式的時候處理被混淆的代碼。運行ProGuard是完全可選的,但是強烈推薦。
這個文檔描述了如何啟動和配置ProGuard,以及使用retrace工具解碼被混淆的堆疊追蹤。
啟動ProGuard
————————————————————————————————————————————————————————————
當你建立一個Android項目,在項目的根目錄下自動產生一個proguard.cfg檔案。這個檔案定義了ProGuard如何最佳化和混淆你的代碼,所以你知道如何根據你的需要定製它是非常重要的。預設的設定檔僅僅涵蓋一般情況,所以你很可能為了你自己的需求必須編輯它。閱讀下面Configuring ProGuard的章節瞭解定製ProGuard設定檔的資訊。
為了啟動ProGuard使它作為Ant或者Eclipse構建的一部分,設定<project_root>/project.properties檔案中的proguard.config屬性。這個路徑可以是絕對路徑或者一個相對項目根目錄的路徑。
注意:當使用Android Studio,你必須向你的gradle.build檔案添加構建類型。更多資訊,查閱Gradle Plug User Guid。
如果你放置proguard.cfg檔案在它的預設位置(項目的跟目錄),你像這樣指定它的位置:
proguard.config=proguard.cfg
你也能將檔案移動到任意你想要的位置,並且指定它的絕對路徑:
proguard.config=/path/to/proguard.cfg
當你以Release模式構建你的應用程式,通過運行ant發布或者通過使用Eclipse的匯出嚮導,構建系統自動檢查是否proguard.config屬性是否設定。如果它設定了,ProGuard在把所有東西打包到.apk檔案之前自動處理應用程式位元組碼。在Debug模式不調用ProGuard,以為它使得調試更難處理。
在ProGuard運行後輸出下面的檔案:
dump.txt
描述了在apk檔案所有class檔案的內部結構
mapping.txt
列出了原始和被混淆類,方法和成員之間名稱的映射。這個檔案當你從release構建收到Bug報告的時候非常重要,因為它將混淆的堆棧轉義回原來的類,方法,和成員名稱。更多資訊查閱Decoding Obfuscated Stack Traces。
seeds.txt
列出了沒有被混淆的類和成員。
usage.txt
列出了從.apk被刪除的代碼
這些檔案被放置在下面的目錄:
注意:每次你在release模式運行一次構建,這些檔案都被ProGuard最新產生的檔案覆蓋。每次你發布你的應用程式儲存它們的複本,為了從你的release構建反混淆Bug報告。