SMALI语法解析
- Davlik字节码中,寄存器是32位,可以支持任何类型。
- 64位类型用2个寄存器表示。
- Davlik字节码中有两种类型,分别是原式类型和引用类型。
原式类型
Z -> boolean
V -> void
B -> byte
S -> short
C -> char
I -> int
J -> long (64 bit)
F -> float
D -> double (64 bit)
对象类型
Lpackage/name/ObjectName;
--> 相当于java中的package.name.ObjectName;L
:表示这是一个对象类型package/name
:该对象所在的包;
:表示对象名称的结束
数组表示形式
[l
:表示整型的一维数组,相当于int[]
对于多位数组,只需要增加
[
即可
对象数组
[Ljava/lang/String
:表示一个String的对象数组
方法的表示
Lpackage/name/ObjectName;
methodName(III)Lpackage/name/ObjectName
表示类型methodName
表示方法名III
表示参数,这里为3个整型参数
字段的表示形式
Lpackage/name/ObjectNmae;
-> FieldName:Ljava/lang/String;
即表示:包名,字段名和各自段类型
有两种方式指定一个方法中有多少寄存器是可用的
.registers 指定了方法中寄存器的总数
.locals 表明了方法中非参寄存器的总数,出现在方法的第一行
方法的传参
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中
例如一个方法有2个参数,5个寄存器(v0 ~ v4),那么参数将置于最后两个寄存器v3和v4
非静态方法中的第一个参数总是调用该方法的对象
静态方法没有隐含的this参数
寄存器的命名方式
- V命名
- P命名:第一个寄存器就是方法中的第一个参数寄存器
Long和Double是64位,需要两个寄存器
- 关于详细的字节码,可以参考:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html