原始类型
V void
Z boolean
B byte
S short
C char
I int
J long
F float
D double
引用类型
L 对象
[ 数组
Android是基于寄存器存储的,一个寄存器占32位,java中long和double占8个字节,每一字节占8位,所以要用2个寄存器存储。
smali的语法
.field 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
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, 不符合条件向下走, 符合条件执行cond_0分支.line25const/4v1,0x1// 符合条件分支.line27:goto_0 return v1 :cond_0const/4v1,0x0// cond_0分支goto :goto_0.endmethod