简单的说,Smali就是Dalvik VM内部执行的核心代码。
1. Smali的基本类型
- B---byte
- C---char
- D---double
- F---float
- I---int
- J---long
- S---short
- V---void
- Z---boolean
- [XXX---array (数组)
- Lxxx/yyy---object (对象)
2. 函数的定义
函数的定义一般为:
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意参数与参数之间没有任何分隔符,同样举几个例子就容易明白了:
(1) foo ()V
没错,这就是void foo()。
(2) foo (III)Z
这个则是boolean foo(int, int, int)。
(4) foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;
看出来这是String foo (boolean, int[], int[], String, long) 了吗?
3. Smali基本语法
- .field private isFlag:z 定义变量
- .method 方法
- .parameter 方法参数
- .prologue 方法开始
- .line123 此方法开始于123行
- invoke-super 调用父函数
- const/high16 v0,0x7fox 把0x7fox的值赋值给v0
- invoke-direct 调用函数
- return-void 函数返回void
- .end method 函数结束
- new-instance 创建实例
- iput-object 对象赋值
- iget-object 调用对象
- invoke-static 调用静态函数
- .class public Lcom/disney/WMW/WMWActivty; 类名
- .super Lcom/XXX/XXX/XXX; 父类名
- .source “XXX.java” 源文件名
- .implements Lcom/XXX/XXX/XXX; 实现了接口
- .annotation 内部类
- Smali局部变量
(1) 本地寄存器 (local register, 非参寄存器)
常用v开头数字结尾的符号表示 v0,v1,v2…
(2) 参数寄存器 (parameter regisgter)
常用p开头数字结尾的符号来表示 p1,p2,p3…
a .register 用来标明方法中寄存器的总数,即参数寄存器和非参寄存器
b .local 标明在这个函数中最少要用到本地寄存器的个数,出现在方法第一行.
5.Smali条件语法
if-eq vA,vB,:cond_** 如果vA等于vB则跳转到:cond_**
ne 不等于
lt 小于
le 小于等于
gt 大于
ge 大于等于
eqz 等于0
nez 不等于0
ltz 小于0
gez 大于等于0
gtz 大于0
lez 小于0