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/目录下