Smali是一种汇编语法,来源Dalvik的vm的字节码,即dex文件中的bytecode=二进制数据,反汇编后得到的Smali代码,对应文件叫:Smali文件
dalvik的字节码有两大类类型,原始类型和引用类型。引用类型是对象和数组,其他一切都是原始类型。
一、原始类型语法类型smali和java对比
V void
Z boolean-----区别点
B byte
S short
C char
I int
J long(64bits)---区别点
F float
D double(64bits)
二、引用类型
对象类型:对象类型以L作为开头,格式是:LpackageName/objectName;(注意必须有个分号跟在最后),String对象在smali中为Ljava/lang/String;,
内部类的格式为:LpackageName/objectName$subObjectName;在内部类前面加$符号
数组类型:在基本类型前面加[ ,例如int数组和float数组分别表示为[I、[F
方法:总是以非常详细的形式指定,其中包括方法的类型、方法名称、参数类型和返回类型
格式:Lpackage/name/ObjectName;->MethodName(III)Z
eg:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;在java中是:
String method(int,int[][],int,String,Object[])
三、Smali基本语法:
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 123 此方法位于123行
invoke-super 调用父函数
const/high16 vo,ox7fo3 把ox7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
四、条件跳转分支:
“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中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的
寄存器为32位,可以支持任何类型。
寄存器分为本地寄存器和参数寄存器
本地寄存器:用v开头数字结尾的符号来表示 eg:v0、v1、v2
参数寄存器:用p开头数字结尾的符号来表示 eg:p0、p1、p2
在非static方法中,po代指this,p1为方法的第一个参数
在static方法中,p0为方法的第一个参数
说明:.register:指定了方法中寄存器的总数,.locals:表明了方法中非参寄存器的总数,出现在方法中的第一行
五、操作指令
成员变量格式是:.field public/private [static] [final] varName:<类型>
对于不同的成员变量也有不同的指令
一般来说 获取的指令有:
iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等 看到get的都是获取指令
操作的指令有:
iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等
没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地boolean类型则使用带“-boolean”的操作指令操作。
array的操作是aget和aput
六、方法/函数 Methods
.method public/private [static][final] methodName()<类型>
.end method
函数类型
direct method = private方法
virtual method = 其余的方法(public、protected)
函数调用
格式:invoke-指令类型{参数1,参数2...},L类名;->方法名
包含
invoke-direct
invoke-virtual
invoke-static
invoke-super
invoke-interface
函数返回结果:
invoke-result或move-result-object来保存函数返回的结果
invoke-result返回基本数据类型
move-result-object返回对象类型