ProGuard充当Java类文件的缩小,优化,混淆,先行检验的角色。
总体原理描述
<1>缩小步骤找出并移除无用类,字段,方法和属性。优化过程分析和优化方法的字节码。
<2>混淆过程用短而无意义的名字重命名余下的类,字段,和方法。
<3>第一个的步骤使代码变得更加小且效率和更难进行逆行工程。最后一个先行检验的步骤添加先行检验信息到类,这个类是java微型版要求并且能提高Java6的启动速度。
注意:
每一个步骤都是可选的。例如,ProGuard也能够仅仅被用来列出应用程序dead code,或者先行检验类文件在Java6高效果运行。
ProGuard通常读取输入Jars(或者wars,ears,zips,或者目录树),然后收缩,优化,混淆和先行检验它们。具有选择性的是,它可以执行多个优化通道,每一个通常遵循另一个收缩步骤。ProGuard把处理结果写到到一个或多个输出jars(或者wars,ears,zips,或者目录树)。输入可能包含资源文件,其名称和内容可选择的被更新以映射到混淆的类名称。
ProGuard要求 library jars(或者wars,ears,zips,或者目录树)指定输入Jars。这些本质上是你将需要编译代码时的libraries。ProGuard用他们去重建那些需要适当处理的类的依赖关系。Library jars本身是保持不变的,你仍然应该把它们放到你的最终应用程序的类路径。
本《使用手册》describes keep 选项的必要性和实例部分提供了很多例子。
Entry points(切入点)
为了确保哪些代码被保存,哪些被废弃或混淆,你必须为你的代码指定一个或多个切入点。
以下切入点通常与类的主方法,applet和midlets相关
1.在收缩步骤,ProGuard从那些种子和递归确定所使用的类和类成员开始。所有其它类和类成员都会被丢弃。
2.在优化步骤,ProGuarad进一步优化代码。在其他的优化中,没有切入点的类和方法可以是private,static or final,且无用的参数可以被移除和一些方法可能是inline的。
3.在混淆步骤,ProGuard重命名没有切入点的类和类成员。在整个过程中,保持切入点确保它们冉冉可以访问它们原来的名字。
4.在先行检验步骤,是不知道入口点的唯一步骤。
Reflection(反射)
反射和introspection为任何自动执行的代码提出了特殊的问题。在ProGuard中,你代码中的类和类成员被创建或者动态调用(即是通过名字),不得不指定为一个切入点。
例如,Class.forName()构造器可能在运行时涉及到任何类。通常不可能预见哪些类必须保留(用它们的原始名称&#