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