Proguard的Optimization可以通过开关-dontoptimize来进行设置。
通过-optimizations可以设置详细的优化规则。
!表示exclude。
"code/simplification/variable,code/simplification/arithmetic"
仅仅做SimplificationVariable和SimplificationArithmetic这两个优化。
"!method/propagation/*"
执行所有的优化,除了methodProgate.
class/marking/final: 尽可能的标记class为final。
实现方法ClassFinalizer, 这个功能,只是修改programClass的修饰符,
programClass.u2accessFlags|=ClassConstants.ACC_FINAL;
此优化不做代码裁剪。
class/unboxing/enum: 简化enum类型为整数常量
SimpleEnumClassChecker:检查Enum类,
SimpleEnumFilter: Enum的过滤
SimpleEnumUseSimplifier: 采用简化
ClassOptimizationInfo这里会存储是否isSimpleEnum,在SimpleEnumMarker中会进行标记。
class/merging/vertical
水平合并类
VerticalClassMerger:类合并就是inline类。
class/merging/horizontal
HorizontalClassMerger:垂直的类合并。
field/removal/writeonly
删除只写的字段。
ReadWriteFieldMarker: 标记所有的字段为只写的。
对OP_GETSTATIC/OP_GETFIELD标记为只读,对OP_PUTSTATIC/OP_PUTFIELD标记为只写,对OP_LDC/OP_LDC_W标记为可读写。
FieldOptimizationInfo: 存储字段的优化信息。
WriteOnlyFieldFilter: 判断该字段是否只写的, 如果是只写的
field/marking/private
将字段标记为private。
MemberPrivatizer: 修改字段或者方法的修饰符为private。
NonPrivateMemberMarker: 确定这些字段和方法是不能private的。
修改字段为private的方法:
programField.u2accessFlags=
AccessUtil.replaceAccessFlags(programField.u2accessFlags,
ClassConstants.ACC_PRIVATE);
field/propagation/value
传播字段的值
判断字段的值是否为常量,如果值是常量,则直接进行替换。
method/marking/private
将方法标记为private
method/marking/static
将方法标记为static
MethodStaticizer: 方法静态化
programMethod.u2accessFlags=
(programMethod.getAccessFlags()&~ClassConstants.ACC_FINAL)|
ClassConstants.ACC_STATIC;
方法静态化
method/marking/final
标记方法为final。
MethodFinalizer: 标记为programMethod.u2accessFlags|=ClassConstants.ACC_FINAL;
method/removal/parameter
删除无用的方法参数。
首先通过ParameterUsageMarker参数使用标记进行标记。
MethodDescriptorShrinker: 方法描述符裁剪。
通过判断方法中的参数是否要用的,ParameterUsageMarker.isParameterUsed。
如果是要用的,则添加。
method/propagation/parameter
传播方法中的参数的值。
method/propagation/returnvalue
传播方法中的返回值
ParameterShrinker。
method/inlining/short
inline短方法。
MethodInliner: 方法inline
inline的方法规则是: 方法的代码行数为8行。对于J2SE为7000行,对于J2ME为2000行。
inline的原理就是复制方法的字节码到另外一个字节码。
method/inlining/unique
inline单一的方法。
method/inlining/tailrecursion
inline尾递归调用。
code/merging
代码合并, 通过修改分支目标, 合并独立的代码块。
GotoCommonCodeReplacer: 公共代码合并,
code/simplification/variable
对OP_ILOAD/OP_DLOAD/OP_ISTORE/OP_ASTORE等指令的优化。
code/simplification/arithmetic
对运算指令等的简化。
code/simplification/cast
对OP_I2B/OP_I2C/OP_I2S等指令的简化处理。
code/simplification/field
对OP_ALOAD/OP_GETSTATIC等指令的简化处理。
code/simplification/branch
简化处理分支指令。
code/simplification/string
code/simplification/advanced
简化基于控制流和数据流的分析。
code/removal/advanced
根据控制流和数据流进行删除
code/removal/simple
删除简单的控制流
code/removal/variable
删除无用的变量
code/removal/exception
删除空的异常块。
code/allocation/variable
优化本地变量frame的变量分配。
maximum.inlined.code.length (default = 8 bytes)
只有8字节的代码可以inline
maximum.resulting.code.length (default = 8000 bytes for JSE, 2000 bytes for JME)
目标代码只有8000字节
optimize.conservatively (default = unset)
来自 <http://proguard.sourceforge.net/manual/optimizations.html>