- 数据类型
B---byte
C---char
D---double
F---float
I---int
J---long
S---short
V---void
Z---boolean
[XXX---array
Lxxx/yyy---object
- 函数的定义
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、...特别注意的是,
p0不一定是函数中的第一个参数,在非static函数中, p0代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…而在static函数中p0才对应第一个参数
(因为Java的static方法中没有this方法)。本地寄存器没有限制,理论上是可以任意使用的
const/4 v0, 0x0
iput-boolean v0, p0, Lcom/disney/WMW/WMWActivity;->isRunning:Z
相当于
this.isRunning = false;
- 函数调用
1)、invoke-static:顾名思义就是调用static函数的
2)、invoke-super:调用父类方法用的指令,在onCreate、onDestroy等方法都能看到
3)、invoke-direct:调用private函数的
4)、invoke-virtual:用于调用protected或public函数
.local 1 标明了你在这个函数中最少要用到的本地寄存器的个数 v0
- 插入日志
.local 5 (用到v4)
const-string v3, "tag"
const-string v4, "log456"
invoke-static {v3, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
打印数字
const/high16 v1, 0x7f030000 const-string v3, "tag" invoke-static {v1}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
- 打印调用栈
new-instance v0, Ljava/lang/Exception; const-string v1, "print trace" invoke-direct {v0,v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V
或者
invoke-static {}, Ljava/lang/Thread;->dumpStack()V