ProGuard用法

原始文章:
https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/manual/usage.html

用法

要运行ProGuard,只需输入:

java -jar proguard.jar options ...

您可以在ProGuard发行版的lib目录中找到ProGuard jar。或者,bin目录包含一些包含此命令的简短的Linux和Windows脚本。通常,您将大多数选项放在配置文件(例如,myconfig.pro)中,只需调用:

java -jar proguard.jar @myconfig.pro

您可以将命令行选项和选项与配置文件组合在一起。例如:

java -jar proguard.jar @myconfig.pro -verbose

您可以在配置文件中添加注释,从#字符开始,直到行尾。

单词和分隔符之间的额外空格被忽略。 具有空格或特殊字符的文件名应使用单引号或双引号引用。

选项可以在命令行的参数和配置文件的行中任意分组。这意味着你可以引用命令行选项的任意部分,以避免特殊字符的shell扩展。

选项的顺序通常是无关紧要的。 对于快速实验,您可以将它们缩写为其第一个唯一字符。

以下部分提供更多细节:
- 输入/输出选项
- 保留选项
- 收缩选项
- 优化选项
- 混淆选项
- 预验证选项
- 一般选项
- 类路径
- 文件名
- 文件过滤器
- 过滤器
- 保留选项概述
- 保留选项修饰符
- 类规范

1,输入/输出选项

@filename
“-include filename”的缩写。

-include filename
从给定的文件文件名递归地读取配置选项。

-basedirectory directoryname
在这些配置参数或此配置文件中指定所有后续相关文件名的基本目录。

-injars class_path
指定要处理的应用程序的输入jars(或wars、ears、zips或directories)。这些jar中的类文件将被处理并写入到输出jar中。默认情况下,任何非类文件都将被复制而不发生更改。请注意任何临时文件(例如由ide创建的),特别是如果您正在从目录中直接读取输入文件。类路径中的条目可以被过滤,如过滤器部分所解释的。为了获得更好的可读性,可以使用多个 -injars 选项指定类路径条目。

-outjars class_path
指定输出jars(或者wars,ears,zips或directories)的名称。前面的-injars选项的处理输入将被写入命名的jar。 这允许您将输入jar组的内容收集到相应的输出jar组中。另外,输出条目可以被过滤,如过滤器部分所述。然后,每个已处理的类文件或资源文件都会在输出jar组中的匹配过滤器中写入到第一个输出条目。

您必须避免让输出文件覆盖任何输入文件。 为了更好的可读性,可以使用多个-outjars选项指定类路径条目。没有-outjars选项,就不会有任何输出。

-libraryjars class_path
指定要处理的应用程序的库jars(或者wars,ears,zips或directories)。 这些jar中的文件将不会包含在输出jar中。 指定的库jar应至少包含应用程序类文件扩展的类文件。 仅调用库类文件不需要存在,尽管它们的存在可以改善优化步骤的结果。类路径中的条目可以被过滤,如过滤器部分所解释的。为了获得更好的可读性,可以使用多个- libraryjar选项指定类路径条目。

请注意,在查找类库时,不考虑运行ProGuard的引导路径和类路径设置。这意味着您必须显式地指定代码将使用的运行时jar。尽管这看起来很麻烦,但是它允许您处理针对不同运行时环境的应用程序。例如,您可以通过指定适当的运行时jar来处理J2SE应用程序和JME midlet。

-skipnonpubliclibraryclasses
指定在读取库jar时跳过非公开类,加快处理并减少ProGuard的内存使用。默认情况下,ProGuard读取非公共和公共库类。 然而,非公开类通常不相关,如果它们不影响输入jar中的实际程序代码那么忽略它们,这样可以加速ProGuard,而不会影响输出。不幸的是,一些库,包括最近的JSE运行时库,包含公共库类扩展的非公共库类。你不能使用这个选项。如果该选项被设置而导致ProGuard找不到类那么ProGuard将会打印警告。

-dontskipnonpubliclibraryclasses
指定不忽略非公共库类。 从版本4.5开始,这是默认设置。

-dontskipnonpubliclibraryclassmembers
指定不忽略包可见库类成员(字段和方法)。 默认情况下,ProGuard在解析库类时跳过这些类成员,因为程序类通常不会引用它们。 然而,有时候,程序类驻留在与库类相同的包中,它们引用它们的包可见类成员。 在这些情况下,实际读取类成员可能是有用的,以确保处理的代码保持一致。

-keepdirectories [directory_filter]
指定输出jars(或wars、ears或directories)要保存的目录。默认情况下,将删除目录条目以减小jar的大小,但是如果程序代码试图用“MyClass.class.getResource(”“)”这样的结构来找到它,这可能是不合需要的。如果在没有过滤器的情况下指定了该选项,则保留所有目录。 使用过滤器,只保留匹配的目录。

-target version
指定要在处理的类文件中设置的版本号。版本号可以是1.0,1.1,1.2,1.3,1.4,1.5(或仅仅是5),1.6(或仅仅是6)或1.7(或仅仅是7)之一。 默认情况下,类文件的版本号保持不变。 例如,您可能希望将类文件升级到Java 6,通过更改其版本号并对其进行预验证。

-forceprocessing
指定处理输入,即使输出似乎是最新的。
最新的测试是基于指定输入,输出和配置文件或目录的日期戳的比较。

2,保留选项

-keep [,modifier,…] class_specification
指定要作为入口点保留的类和类成员(字段和方法)。例如,为了保留应用程序,您可以指定主类及其主方法。 为了处理一个库,你应该指定所有可公开访问的元素。

-keepclassmembers [,modifier,…] class_specification
指定要保留的类成员,如果它们的类也被保留了。例如,您可能希望保留实现Serializable接口的所有序列化字段和方法。

-keepclasseswithmembers [,modifier,…] class_specification
指定要保存的类和类成员,条件是所有指定的类成员都存在。例如,您可能希望保留所有具有main方法的应用程序,而不必显式地列出它们。

-keepnames class_specification
Short for -keep,allowshrinking class_specification。
指定要保留其名称的类和类成员,如果它们在收缩阶段没有删除。例如,您可能希望保留实现Serializable接口的类的所有类名,以便处理的代码与任何原始的序列化类保持兼容。。不使用的类仍然可以被删除。只适用混淆。

-keepclassmembernames class_specification
Short for-keepclassmembers,allowshrinking class_specification。
指定要保留名称的类成员,如果它们在收缩阶段没有删除。例如,在处理由JDK 1.2或更老版本编译的库时,您可能想要保留合成类$方法的名称,所以当处理使用处理过的库的应用程序时,混淆器可以再次检测它(尽管ProGuard本身不需要这个应用程序)。 仅适用于混淆。

-keepclasseswithmembernames class_specification
Short for-keepclasseswithmembers,allowshrinking class_specification。
指定要保留其名称的类和类成员,条件是在收缩阶段之后所有指定的类成员都存在。例如,您可能希望保留所有本地方法名和它们类的名称,这样处理的代码仍然可以链接到本机库代码。不使用的本地方法仍然可以被删除。如果使用了类文件,但其原生方法都不使用,它的名称仍然会被混淆。只适用混淆。

-printseeds [filename]
指定使用不同的-keep选项来匹配的详尽的列表类和类成员。列表被打印到标准输出或给定的文件中。该列表可以用于验证是否真正找到了预期的类成员,特别是在使用通配符的情况下。例如,您可能想要列出所有的应用程序或所有的applet。

3,收缩选项

-dontshrink
指定不缩小输入类文件。 默认情况下,应用收缩; 删除所有类和类成员,除了各种-keep选项所列出的类和类成员,以及它们直接或间接依赖的类。 每个优化步骤之后也应用收缩步骤,因为一些优化可能会打开删除更多类和类成员的可能性。

-printusage [filename]
指定输入类文件的死代码。列表被打印到标准输出或给定的文件中。例如,您可以列出应用程序的未使用代码。只适用于收缩。

-whyareyoukeeping class_specification
指定打印关于给定类和类成员在缩小步骤中保持的原因的详细信息。 如果您想知道为什么某些给定的元素存在于输出中,这可能很有用。 一般来说,可能有很多不同的原因。此选项将针对每个指定的类和类成员打印最短的方法链到指定的种子或入口点。在目前的实施中,打印输出的最短链有时可能包含循环扣除——这些并不反映实际的收缩过程。 如果指定了-verbose选项,则跟踪包括完整的字段和方法签名。 只适用于收缩。

4,优化选项

-dontoptimize
指定不优化输入类文件。默认情况下,优化是启用的;所有方法都在字节码级别上进行了优化。

-optimizations optimization_filter
指定要在更细粒度的级别启用和禁用的优化。 仅适用于优化。 这是一个专家级别的选项。

-optimizationpasses n
指定要执行的优化通过次数。 默认情况下,执行单程。 多次通过可能导致进一步的改进。 如果在优化通过后没有找到改进,则优化结束。 仅适用于优化。

-assumenosideeffects class_specification
指定没有任何副作用(可能返回值)的方法。在优化步骤中,ProGuard将删除对这些方法的调用,如果它可以确定返回值不被使用。注意,ProGuard将分析程序代码,以自动查找这些方法。
它不会对库代码进行分析,因此可以使用该选项。例如,您可以指定方法system . currenttimemillis(),以便将任何空闲调用删除。注意,ProGuard将选项应用于指定方法的整个层次结构。只有优化时适用。一般来说,假设是危险的;你可以轻松打破处理的代码。仅仅在你知道你在做什么的时候使用这个选项。

-allowaccessmodification
指定在处理过程中可以扩展类和类成员的访问修饰符。 这可以改善优化步骤的结果。例如,当内联一个公共getter时,可能需要将访问的字段公开。尽管Java的二进制兼容性规范正式不需要这一点(cfr。Java语言规范,第二版,第13.4.6节),一些虚拟机在处理代码的时候会有问题。只适用于优化时(以及在使用- repackageclasses选项时)。

数据显示::在处理用作库的代码时,您不应使用此选项,因为在API中没有设计的类和类成员可能会被公开。因为类和类成员在API中没有被设计为公开的。

-mergeinterfacesaggressively
指定要合并的接口,即使它们的实现类不实现所有接口方法。这可以通过减少类的总数来减小输出的大小。注意,Java的二进制兼容性规范允许这样的构造(cfr。Java语言规范,第二版,第13.5.3节),即使它们不允许使用Java语言(cfr。Java语言规范,第二版,第8.1.4节)。只有优化时适用。

数据显示:设置此选项可以减少一些jvm上处理的代码的性能,因为高级的即时编译倾向于使用更少的实现类来支持更多的接口。更糟糕的是,一些jvm可能无法处理生成的代码。值得注意的是:

  • Sun的JRE 1.3在一个类中遇到超过256个Miranda方法(接口方法没有实现)时可能会抛出一个内部错误。

5,混淆选项

-dontobfuscate
指定不混淆输入类文件。 默认情况下,应用混淆; 类和类成员收到新的短随机名称,除了各种-keep选项列出的名称。内部属性对于调试很有用,像源文件名,变量名和行号都会被删除。

-printmapping [filename]
指定为已重命名的类和类成员打印从旧名称到新名称的映射。映射被打印到标准输出或给定的文件。例如,它需要后续的增量混淆,或者如果您想要重新理解模糊的堆栈跟踪。仅适用于混淆。

-applymapping filename

你可能感兴趣的:(android资料)