可以根据Dalvik opcodes来学习这些 smali 指令
new-array
const/4 v6, 0x2 # 数组元素个数
new-array v7, v6, [Ljava/lang/Class; # v7持有数组的引用
aput-object vx,vy,vz
vx: 表示类型
vy: 引用
vz: 角标
const/4 v6, 0x2
new-array v6, v6, [Ljava/lang/Class;
const/4 v7, 0x0 # 索引 0位子
const-class v8, Ljava/lang/Long; # 元素类型
aput-object v8, v6, v7
const/4 v7, 0x1 # 索引 1 位子
const-class v8, Ljava/lang/Integer; #元素类型
aput-object v8, v6, v7
new-instance
new-instance v0, Ljava/lang/String; # 创建String 对象
invoke-direct
invoke-direct {p0}, Ljava/lang/Object;->()V # 表示直接调用无参构造方法
invoke-virtual
invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V # 执行虚拟方法
invoke-static
invoke-static {}, Lcom/example/lib/smali/HelloWorld;->sayHello()V # 执行静态方法
.line
.line 14 # 在java源文件中对应的行号
return-void
return-void # 方法返回 void
.locals
.locals 0 # 指定局部变量的个数
.local v0, “str”:Ljava/lang/String; #局部变量 str 类型为String
sget-object
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; # 普通对象赋值
const-string
const-string v0, “haha” # 将字符串”haha” 赋值给 v0
return-object
return-object v0 # 将v0 作为返回值返回
.end method
.end method #方法结束符
const/4
const/4 v1, 0x1 # 将占有4字节的变量赋值给变量v1,这里是将 v1 等于1
check-cast
check-cast v2, Lcom/example/duia/myapplication/ShadeView; # 类型转换检查
iput-object
# 为v2赋值等于root_ll,当前的Activity 持有v2的引用
iput-object v2, p0, Lcom/example/duia/myapplication/MainActivity;
->root_ll:Lcom/example/duia/myapplication/ShadeView;
add-int/lit8
add-int/lit8 v7, v7, 0x7 # v7 = v7 + 7
:try_start_0
try 语句的开始部分
:try_end_0
try 语句的结束部分