ProGuard工具通過移除未使用代碼和使用語義模糊的名字重命名類、成員變量及方法, 從而實現減小、優化和混淆利用程序代碼.
使用ProGuard工具后, 會得到1個更小的.apk文件, 并且使得逆向工程更加困難. 由于ProGuard使得利用程序的逆向工程更加困難,
所以當利用程序用到了對安全很敏感的特性時, 就有必要使用ProGuard工具了.
ProGuard工具集成在Android的編譯系統中, 所以不需要人工調用它. 只有當利用程序以release模式編譯時,ProGuard工具才會
運行,所以當利用以debug模式編譯時, 不需要處理被混淆的代碼. ProGuard工具是完全可選的, 但是強烈建議使用它.
當創建1個Android項目時, 會在項目的根目錄自動生成1個proguard.cfg文件. 這個文件定義了ProGuard該怎樣優化和混淆項目
代碼,所以根據自己的需求定制化這個文件是非常重要的. 默許的配置文件僅僅包括了1般的情況, 所以極有可能你需要根據自己的
需求修改它.為了使能ProGuard工具從而使它作為Ant或Eclipse編譯的1部份, 設置<project_root>/project.properties文件中的
proguard.config屬性值,屬性值是1個路徑, 這個路徑可以是1個絕對路徑或是或是工程根目錄的1個相對路徑.
當以release模式編譯利用程序時(通過運行ant release或Eclipse的導出工具), 編譯系統自動檢查proguard.config屬性是不是已設置.
如果設置了, ProGuard在把相干資源打包到apk文件之前就會自動處理利用的字節碼. 以debug模式編譯不會調起ProGuard, 由于這將
使得調試更加艱巨.
ProGuard在運行以后會輸出以下幾個文件
dump.txt
描寫了apk文件中所有class文件的內部結構
mapping.txt
列出了原始的類、方法、字段名和混淆后的映照關系. 這個文件對發布版本的bug報告非常重要. 可以根據它把混淆后的調用棧
還原回原始的類、方法和字段名
seeds.txt
列出了所有無被混淆的類和成員.
usage.txt
列出了從apk中移除的代碼.
注意:每次進行release模式的編譯, 這些文件都會被ProGuard生成的最新的文件覆蓋, 所以每次發布release模式的利用都需要保存
1份這幾個文件.
對1些情況, proguard.cfg中的默許配置就可以夠滿足需求. 但是, 更多的情況是ProGuard很難準確地分析, 它可能移除1些它認為
用不到的代碼, 但實際上利用程序實際是需要的. 1些例子:
1. 1個只在AndroidManifest.xml中援用的類
2. JNI調用的方法
3. 動態援用的變量和方法.
proguard.cfg文件盡力覆蓋1般的情況, 但是依然有可能碰到ClassNotFoundException,當利用調用了1個已被ProGuard移除的類.
可以通過在proguard.cfg文件中加入-keep來修復這類毛病. 例如
-keep public class <MyClass>
當使用-keep選項時有許多選項, 所有強烈建議瀏覽ProGuard Manual了解更多關于定制配置文件的信息
retrace.bat|retrace.sh [-verbose]mapping.txt [<stacktrace_file>]
retrace.bat|retrace.sh 腳本在<sdk_root>/tools/proguard/目錄下