Proguard的Optimizations

Proguard的Optimization可以通过开关-dontoptimize来进行设置。

通过-optimizations可以设置详细的优化规则。

 

 

!表示exclude。

 

"code/simplification/variable,code/simplification/arithmetic"

仅仅做SimplificationVariable和SimplificationArithmetic这两个优化。

 

 

"!method/propagation/*"

 

执行所有的优化,除了methodProgate.

 

 

class/marking/final  尽可能的标记classfinal

 

实现方法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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章