原始類型
V? ? ? ? ? ? ? ? ? ? ? void
Z? ? ? ? ? ? ? ? ? ? ? boolean
B? ? ? ? ? ? ? ? ? ? ? byte
S? ? ? ? ? ? ? ? ? ? ? short
C? ? ? ? ? ? ? ? ? ? ? char
I? ? ? ? ? ? ? ? ? ? ? int
J? ? ? ? ? ? ? ? ? ? ? long
F? ? ? ? ? ? ? ? ? ? ? float
D? ? ? ? ? ? ? ? ? ? ? double
引用類型
L? ? ? ? ? ? ? ? ? ? ? 對象
[? ? ? ? ? ? ? ? ? ? ? 數(shù)組
Android是基于寄存器存儲的蒋畜,一個寄存器占32位,java中l(wèi)ong和double占8個字節(jié),每一字節(jié)占8位派诬,所以要用2個寄存器存儲熏迹。
smali的語法
.field 定義變量
.method 方法
.parameter 方法參數(shù)
.prologue 方法開始
.line 12 此方法位于第12行
invoke-super 調用父函數(shù)
const/high16? v0, 0x7fo3 把0x7fo3賦值給v0
invoke-direct 調用函數(shù)
return-void 函數(shù)返回void
.end method 函數(shù)結束
new-instance 創(chuàng)建實例
iput-object 對象賦值
iget-object 調用對象
invoke-static 調用靜態(tài)函數(shù)
smali跳轉語句
“if-eq vA, vB, :cond_**” 如果vA等于vB則跳轉到:cond_**
“if-ne vA, vB, :cond_**” 如果vA不等于vB則跳轉到:cond_**
“if-lt vA, vB, :cond_**” 如果vA小于vB則跳轉到:cond_**
“if-ge vA, vB, :cond_**” 如果vA大于等于vB則跳轉到:cond_**
“if-gt vA, vB, :cond_**” 如果vA大于vB則跳轉到:cond_**
“if-le vA, vB, :cond_**” 如果vA小于等于vB則跳轉到:cond_**
“if-eqz vA, :cond_**” 如果vA等于0則跳轉到:cond_**
“if-nez vA, :cond_**” 如果vA不等于0則跳轉到:cond_**
“if-ltz vA, :cond_**” 如果vA小于0則跳轉到:cond_**
“if-gez vA, :cond_**” 如果vA大于等于0則跳轉到:cond_**
“if-gtz vA, :cond_**” 如果vA大于0則跳轉到:cond_**
“if-lez vA, :cond_**” 如果vA小于等于0則跳轉到:cond_**
下面看一個例子
java代碼
privatebooleanshow(){booleantempFlag = ((3-2)==1)?true:false;if(tempFlag) {returntrue;? ? ? ? ? ? ? ? }else{returnfalse;? ? ? ? ? ? ? ? }? ? ? ? ? ? }
轉換smali代碼
.methodprivateshow()Z? ? .locals2.prologue//方法開始.line22const/4v0,0x1// v0賦值為1.line24.local v0, tempFlag:Zif-eqz v0, :cond_0// 判斷v0是否等于0, 不符合條件向下走, 符合條件執(zhí)行cond_0分支.line25const/4v1,0x1// 符合條件分支.line27:goto_0? ? return v1? ? :cond_0const/4v1,0x0// cond_0分支goto :goto_0.endmethod