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>