定义

ProGuard是一个压缩、优化和混淆Java 字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化 字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。

2压缩

JAVA 源代码(.java文件)通常被编译为 字节码(.class文件)。而完整的程序或 程序库通常被压缩和发布成Java文档(.jar文件)。 字节码比 Java源文件更简洁,但是它仍然包含大量的无用代码,尤其它是一个 程序库的时候。ProGuard的压缩程序操作能分析 字节码,并删除无用的类、字段和方法。程序只保留功能上的等价,包括异常 堆栈描述所需要的信息。


3字节码

通常情况下,编译后的 字节码仍然包含了大量的调试信息:源文件名,行号, 字段名,方法名,参数名, 变量名等等。这些信息使得它很容易被反编译和通过 逆向工程获得完整的程序。有时,这是令人厌恶的。例如像ProGuard这样的 混淆器就能删除这些调试信息,并用无意义的字符序列来替换所有名字,使得它很难进行 逆向工程,它进一步地精简代码。除了异常 堆栈信息所需要的类名,方法名和行号外,程序只会保留功能上的等价。通过以上的了解,你应该明白为什么需要混淆了。


4种类优化

ProGuard支持那些种类的优化:

除了在压缩操作删除的无用类,字段和方法外,ProGuard也能在 字节码级提供 性能优化,内部方法有:

常量表达式求值

删除不必要的字段存取

删除不必要的方法调用

删除不必要的分支

删除不必要的比较和instanceof验证

删除未使用的代码

删除只写字段

删除未使用的方法参数

像push/pop简化一样的各种各样的peephole优化

在可能的情况下为类添加static和final 修饰符

在可能的情况下为方法添加private, static和final 修饰符

在可能的情况下使get/set方法成为内联的

当接口只有一个实现类的时候,就取代它

选择性的删除日志代码

实际的优化效果是依赖于你的代码和执行代码的 虚拟机的。简单的 虚拟机比有复杂JIT编译器的高级虚拟机更有效。无论如何,你的 字节码会变得更小。

5不支持类

仍有一些明显需要优化的技术不被支持:

使非final的常量字段成为内联

像get/set方法一样使其他方法成为内联

将常量表达式移到循环之外

Optimizations that require escape analysis