程序员人生 网站导航

ProGuard工具使用

栏目:综合技术时间:2014-12-18 08:19:59

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

使用ProGuard工具后, 会得到1个更小的.apk文件, 并且使得逆向工程更加困难. 由于ProGuard使得利用程序的逆向工程更加困难,

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

 

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

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

 

使能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份这几个文件.

 

配置ProGuard

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


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐