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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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