ProGuard Version5.2(4.1)Manual-->Introduction

ProGuard是一个Java类文件收缩器,优化器,混淆器和预校验器。收缩步骤检测并删除未使用的类、字段、方法和属性。优化步骤分析和优化方法的字节码。混淆步骤用短的无意义的名称重命名剩余的类、属性和方法。以上的步骤使得代码库更小,效率更高,更难反向工程。最后的预校验步骤添加预校验信息到类中,这是Java Micro Edition,Java 6和更高版本的要求。
这些步骤中的每一个都是可选的。例如,ProGuard也可以用来只列出一个应用的无用代码,或在Java 6为了高效使用预验证类文件。
ProGuard首先读取输入的jars(or aars, wars, ears, zips, apks, or directories)。随后收缩、优化、混淆和预校验。你可以选择让ProGuard执行多个优化过程。ProGuard写处理结果到一个或多个输出Pjars (or aars, wars, ears, zips, apks, or directories)。输入可能包含资源文件,其名称和内容可以被更新以反映混淆的类名。
ProGuard要求指定输入的库jars (or aars, wars, ears, zips, apks, or directories)。这些基本上是你需要编译代码的库。ProGuard使用它们来重建对适当处理来说必须的类依赖关系。库jar本身不变,你需要把它们放在你的应用的类路径处。

入口点

为了确定哪些代码被保存,哪些代码可以丢弃或处理的,你必须指定一个或多个入口点代码。这些入口点通常与主要方法,applets,midlets,activities等有关。

在收缩阶段,ProGuard从这些种子出发、递归地确定所使用的类和类成员。所有其他类和类成员都被丢弃。

在优化阶段,ProGuard进一步优化代码。对于非进入点的其他的优化,类和方法可以设置成由private, static或final,未使用的参数可以被删除,有些方法可以内联。
在混淆阶段,ProGuard重命名非入口点的类和类成员。在整个过程中,保持入口点以确保他们仍然可以被他们的原始名称访问。
预校验是唯一一个不需要知道入口点的阶段。
手册的使用部分(http://proguard.sourceforge.net/manual/usage.html)描述了必要的-keep options(http://proguard.sourceforge.net/manual/usage.html#keepoptions),实例部分(http://proguard.sourceforge.net/manual/examples.html)提供了大量的例子。

反射
反射和内省对代码的自动处理提出了特别的问题。在ProGuard中,在你的代码中被创建和动态调用(通过名称)类和类成员必须也被指定为入口点。例如,Class.forName()在运行时可能指向任何类。通常(用原始名称)计算哪一个类被保留是不可能的。例如,类名可能从配置文件中读取。因此,你必须在你的ProGuard配置中使用同样简单的-keep options指定它们。
然而,ProGuard将检测并为您处理以下情况:
Class.forName("SomeClass")
SomeClass.class
SomeClass.class.getField("someField")
SomeClass.class.getDeclaredField("someField")
SomeClass.class.getMethod("someMethod", new Class[] {})
SomeClass.class.getMethod("someMethod", new Class[] { A.class })
SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })
SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})
SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })
SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })
AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")
AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")
AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")
类和类成员的名字可能不同,但是对ProGuard来说构造器字面上应该相同以识别它们。在收缩阶段引用的类和类成员被保留,在混淆阶段字符串参数被正确更新。此外,如果保持一些类或类成员的必要出现,ProGuard会提供一些建议。例如,ProGuard会注意到了像(SomeClass)Class.forName(variable).newInstance()的代码。这可能是一个表明类或接口someclass和/或它的实现可能需要保存的迹象。你可以据此相应地调整你的配置。
为了正确的结果,你至少应该对你处理的代码有点熟悉。特别地,没有关于内部代码的必要信息,混淆执行了很多反射的可能需要试验和错误。

你可能感兴趣的:(ProGuard Version5.2(4.1)Manual-->Introduction)