- 10
- 0
- 约1.02万字
- 约 11页
- 2018-01-02 发布于河南
- 举报
Android 打包混淆
Android打包
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹。
ProGuard是一个免费的java类文件压缩、优化和混淆器。它探测并删除没有使用的类、字段、方法和属性。它删除没有用的说明并使用字节码得到最大优化。Proguard作为一个代码混淆的工具,它使用无意义的名字来重命名类、字段和方法。通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。
ProGuard相关的一些 通过ProGuard得到的更精简的jar文件意味着只需要更小的存储空间;网络传输更省时;装载速度更快和占用更小的内存空间。另外,ProGuard非常快速和高效,它仅仅只花费几秒钟和几兆的内存在处理程序。它处理的顺序是先压缩,然后优化,最后才进行混淆。
什么是压缩?
Java 源代码(.java文件)通常被编译为字节码(.class文件)。而完整的程序或程序库通常被压缩和发布成Java文档(.jar文件)。字节码比 Java源文件更简洁,但是它仍然包含大量的无用代码,尤其它是一个程序库的时候。ProGuard的压缩操作能分析字节码,并删除无用的类、字段和方法。程序只保留功能上的等价,包括异常堆栈描述所需要的信息。
什么是混淆?
通常情况下,编译后的字节码仍然包含了大量的调试信息:源文件名,行号,字段名,方法名,参数名,变量名等等。这些信息使得它很容易被反编译和通过逆向工程获得完整的程序。但ProGuard的混淆器功能,
更名,将私有类,私有的成员,方法体内部的变量名改名,改成a,b,c等等;
改变逻辑的流向,如将if条件取反,if/else对换;
等价代码,如将循环改成GOTO;
无效代码,插入不可及的无用代码;
ProGuard支持那些种类的优化?
除了在压缩操作删除的无用类,字段和方法外,ProGuard也能在字节码级提供性能优化,内部方法有:
常量表达式求值
删除不必要的字段存取
删除不必要的方法调用
删除不必要的分支
删除不必要的比较和instanceof验证
删除未使用的代码
删除只写字段
删除未使用的方法参数
像push/pop简化一样的各种各样的peephole优化
在可能的情况下为类添加static和final修饰符
在可能的情况下为方法添加private, static和final修饰符
在可能的情况下使get/set方法成为内联的
当接口只有一个实现类的时候,就取代它
选择性的删除日志代码
实际的优化效果是依赖于你的代码和执行代码的虚拟机的。简单的虚拟机比有复杂JIT编译器的高级虚拟机更有效。无论如何,你的字节码会变得更小。但仍有一些明显需要优化的技术不被支持:
使非final的常量字段成为内联
像get/set方法一样使其他方法成为内联
将常量表达式移到循环之外
Optimizations that require escape analysis
ProGuard的使用:
java –jar proguard.jar options ……
你也可以把这些属性写在配置文件里,运行时,我们只需要指定这个配置文件就行了,例如:
java –jar proguard.jar @config.pro
配置文件的格式要按照ProGuard提供的格式来写,这可以参考ProGuard例子里的配置文件来配置适合你的应用系统的ProGuard配置文件。ProGuard提供了图形界面的配置和运行程序(proguardgui) 如果你要在Ant里运行ProGuard,只需要添加一一个如下的target即可:
target name=proguard depends=init
taskdef resource=proguard/ant/task.properties
classpath=${lib.dir}/proguard/proguard.jar /
proguard configuration=${src.dir}/config.pro /
/target
你只需要制定lib.dir和src.dir属性就行了。建议大家把ProGuardGUI当成一个生成配置文件的向导来使用,这样我们只需要修改配置文件而不用重新写一个配置文件。
ProGuard在ADT中的用法 在Android 2.3以前,混淆Android代码只能手动添加proguard来实现代码混淆,非常
原创力文档

文档评论(0)