首页 > 代码库 > ProGuard工具使用

ProGuard工具使用

ProGuard工具通过移除未使用代码和使用语义模糊的名字重命名类、成员变量及方法, 从而实现减小、优化和混淆应用程序代码.

使用ProGuard工具后, 会得到一个更小的.apk文件, 并且使得逆向工程更加困难. 因为ProGuard使得应用程序的逆向工程更加困难,

所以当应用程序用到了对安全很敏感的特性时, 就有必要使用ProGuard工具了.

 

ProGuard工具集成在Android的编译系统中, 所以不需要人工调用它. 只有当应用程序以release模式编译时,ProGuard工具才会

运行,所以当应用以debug模式编译时, 不需要处理被混淆的代码. ProGuard工具是完全可选的, 但是强烈建议使用它.

 

使能ProGuard

当创建一个Android项目时, 会在项目的根目录自动生成一个proguard.cfg文件. 这个文件定义了ProGuard该怎样优化和混淆项目

代码,所以根据自己的需求定制化这个文件是非常重要的. 默认的配置文件仅仅包含了一般的情况, 所以极有可能你需要根据自己的

需求修改它.为了使能ProGuard工具从而使它作为Ant或Eclipse编译的一部分, 设置<project_root>/project.properties文件中的

proguard.config属性值,属性值是一个路径, 这个路径可以是一个绝对路径或者是或者是工程根目录的一个相对路径.

 

当以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模式的应用都需要保存

一份这几个文件.

 

配置ProGuard

对于一些情况, proguard.cfg中的默认配置就能够满足需求. 然而, 更多的情况是ProGuard很难准确地分析, 它可能移除一些它认为

用不到的代码, 但实际上应用程序实际是需要的. 一些例子:

1. 一个只在AndroidManifest.xml中引用的类

2. JNI调用的方法

3. 动态引用的变量和方法.

 

proguard.cfg文件尽力覆盖一般的情况, 但是仍然有可能碰到ClassNotFoundException,当应用调用了一个已经被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/目录下


ProGuard工具使用