ProGuard Version5.2(3)FAQ

3.1What is shrinking?(什么是收缩?)
Java源代码(.Java文件)通常被编译成字节码(.class文件)。字节码比Java源代码更紧凑,但它仍可能包含大量的无用代码,特别是如果它包括程序库。Shrinking程序如ProGuard可以分析字节码和删除未使用的类、属性和方法。该程序仍然在功能上等效,包括在异常堆栈跟踪的信息。
3.2What is obfuscation?(什么是模糊处理?)
默认情况下,编译后的字节码中也包含了大量的调试信息:源文件名,行号,字段名,方法名,参数名,变量名等。这些信息将使反编译字节码和逆向工程整个程序简单。有时,这是不可取的。Obfuscation如ProGuard可以去除调试信息和更换所有的名字为毫无意义的字符序列,使它更难逆向代码。它进一步地压缩代码作为加分项。该程序仍然在功能上等效,除了类名称,方法名称,以及在异常堆栈跟踪的行数。
3.3What is preverification?(什么是预校验?)
当载入类文件时,类装载器执行一些复杂的字节码验证。该分析确保代码不会意外或故意从虚拟机的沙盒中断。Java Micro Edition和Java 6引入了拆分验证。这意味着,JME预验证和Java 6编译器为了简化类装载器的实际校验步骤,添加了预校验信息到类文件中(StackMap和StackMapTable属性,分别)。类文件可以以更快,更有效的内存的方式加载。ProGuard可以执行preverification步骤,例如允许在Java 6中重定向旧的类文件。
3.4What kind of optimizations does ProGuard support?(ProGuard支持什么类型的优化?)
除了在shrinking阶段删除未使用的类、属性和方法,ProGuard也可以执行优化的字节码级别,内部和整个方法。归因于类似控制流分析,数据流分析,部分评价,静态单赋值,全球编号,和活性分析技术,ProGuard可以:
评估常量表达式。
删除不必要的属性访问和方法调用。
删除不必要的分支。
删除不必要的比较和实例测试。
删除未使用的代码块。
合并相同的代码块。
减少变量分配。
删除只写的字段和未使用的方法参数。
内联常量字段、方法参数和返回值。
内联短或只调用一次的方法。
简化尾递归调用。
合并类和接口。
在可能的情况下,把方法private,static,和final。
在可能的情况下,把类static和final。
替换只有单一实现的接口。
完成超过200窥孔优化,比如用……<< 1替换……* 2。
选择性地删除日志代码。
这些优化的积极作用将取决于你的代码和代码执行的虚拟机。简单的虚拟机可能比拥有复杂的JIT编译器的先进的虚拟机受益更多。至少,字节码可以更小一点。
尚未支持的一些值得注意的优化:
移除loops外的常量表达式
需要逃逸分析的优化(DexGuard做了)
3.5Can I use ProGuard to process my commercial application?(我可以使用ProGuard来处理我的商业应用吗?)
可以。ProGuard本身在GPL下分布,但这并不影响你的程序的处理。你的代码仍然是你的,它的许可证可以保持不变。
3.6Does ProGuard work with Java 2, 5, ..., 8?(ProGuard可以在Java2,5,...,8上使用吗?)
可以,ProGuard支持从1.1到8.0的所有JDK。Java2在类文件格式中引入了一些小的差异。Java 5为泛型和注释添加了属性。Java 6引入了可选的preverification属性。Java 7使preverification变成必须的,并引入了对动态语言的支持。Java 8增加了更多的属性和默认的方法。ProGuard可以正确处理所有的版本。
3.7Does ProGuard work with Java Micro Edition?(ProGuard可以运行在Java Mirco Edition上吗?)
可以。ProGuard可以运行在Java Standard Edition,但是你也可以自由地指定你的程序的目标运行时环境,包括Java Micro Edition。ProGuard也可以执行要求的预校验,产生比传统的外部预校验更紧凑的结果。
ProGuard也带有一个为JME Wireless Toolkit使用的混淆器插件。
3.8Does ProGuard work for Google Android code?(ProGuard可以在Google的Android代码上使用吗?)
可以。Google的dx编译器将原始的jar文件转称可以在Android设备上运行的文件。通过预处理原始的jar文件,ProGuard可以显著地减少文件大小,提高代码的运行时性能。它是Android SDK的一部分。DexGuard,为Android开发的ProGuard的兄弟,提供了额外的优化和更多的应用程序保护。
3.9Does ProGuard work for Blackberry code?(ProGuard可以在Blackberry代码上使用吗?)
应该可以。RIM的专有rapc编译器可以将普通的JME jar文件转换成可运行在黑莓设备上的cod文件。编译器执行相当多的优化,但通常用ProGuard预处理jar文件仍然可以将最终代码减少几个百分点。然而,rapc编译器似乎也有些bug。有时混淆代码会失败,即使它是有效的并可以被其他JME和VMs接受。您的里程可能因此而有所不同。
3.10Does ProGuard have support for Ant?(ProGuard支持Ant吗?)
支持。Proguard提供了一个Ant任务,所以它可以无缝集成到您的Ant构建过程中。你也可以使用ProGuard的可读格式配置。或者,如果你喜欢XML,你可以指定等效的XML配置。
3.11Does ProGuard have support for Gradle?(ProGuard支持Gradle吗?)
支持。ProGuard还提供一个工具的任务,让它融入你的Gradle的构建过程中。你可以指定到ProGuard自己的的格式配置或嵌入在Groovy配置中。
3.12Does ProGuard have support for Maven?(ProGuard支持Maven吗?)
ProGuard的JAR文件也分布从Maven中央仓库。还有一些第三方插件,支持ProGuard,如Android Maven插件和IDFC Maven ProGuard插件。DexGuarduard也带有一个Maven插件。
3.13Does ProGuard come with a GUI?(ProGuard有图形用户界面吗?)
有的。首先,ProGuard是作为一个命令行工具是非常游泳的,它可以很容易地集成到任何自动构建过程。对于普通用户来说,也有一个简化了创建,加载,编辑,执行,并保存到ProGuard配置的图形用户界面。
3.14Does ProGuard handle Class.forName calls?(ProGuard可以处理Class.forName调用吗?)
可以。ProGuard自动处理构造,比如Class.forName("SomeClass")和SomeClass.class。引用的类都保存在shrinking阶段,字符串参数在obfusation阶段做正确地替换。
使用可变的string参数,通常是不可能决定可能的值的。例如,他们可能从一个配置文件中读取。然而,ProGuard会注意一些像"(SomeClass)Class.forName(variable).newInstance()"之类的构造。这可能是一个类或接口SomeClass和/或它的实现可能需要保存的暗示。开发者可以相应地调整配置。
3.15Does ProGuard handle resource files?(ProGuard可以处理资源文件吗?)
是的。ProGuard复制所有的非class的资源文件,选择性地根据已应用的混淆适应他们的名字和内容。
3.16Does ProGuard encrypt string constants?(ProGuard加密string常量吗?)
不加密,程序代码中的字符串加密必须是完全可逆性的定义,所以它只提高了混淆的水平。它增加了代码的足迹。然而,因为大众的需求,随着更多的对静态和动态分析保护技术,ProGuard的闭源的兄弟DexGuard,提供了字符串加密。
3.17Does ProGuard perform control flow obfuscation?(ProGuard执行流程混淆吗?)
不明确。控制流程混淆注入额外的分支到字节码中,企图愚弄反编译器。为了避免对性能和大小的负面影响,ProGuard没有做流程混淆。然而,优化的步骤往往已经重构代码到了大多数反编译器混淆的地步。
3.18Does ProGuard support incremental obfuscation?(ProGuard支持增量模糊处理吗?)
是的。此功能允许你在一个新的混淆步骤前指定先前的模糊映射文件,以便产生为混淆代码新增组件或补丁。
3.19Can ProGuard obfuscate using reserved keywords?(ProGuard可以使用保留的关键字混淆吗?)
可以。你可以自己指定混淆词典,如保留关键字列表,外国文字标识符,随机源文件,或莎士比亚的一段文字。请注意,这很难提高混淆。好的反编译器可以自动替换保留关键字,并且通过简单名字的混淆所产生的影响是不容易撤消的。
3.20Can ProGuard reconstruct obfuscated stack traces?(ProGuard可以重建混淆堆栈跟踪吗?)
可以。ProGuard带有一个伴侣的工具,ReTrace,可以对混淆应用产生的堆栈跟踪进行反混淆。重建是基于ProGuard写出的映射文件。如果行号都被混淆了,一个列表的替代方法的名称是为每个有模棱两可的反向映射的模糊方法名提供的。请参阅用户手册获取更多细节。
在Badoo的Erik André写了一个用于反混淆HPROF内存转储的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值