Dalvik 是谷歌公司设计用于针对Android平台的虚拟机.Dalvik虚拟机是谷歌等厂商合作开发的Android移动平台的核心组成部分之一.他可以支持已转换为.dex格式的java应用程序的运行.dex格式是专门为Dalvik设计的一种压缩格式.
Dalvik 寄存器
寄存器:用来临时存储二进制代码.
Dalvik寄存器:Dalvik寄存器都是32位,如果需要存储64位就会用相邻的两个寄存器
Dalvik 寄存器命名方式
v命名法 v:局部变量寄存器 v0-vn 参数寄存器:vn-vn+m
p命名法 p:参数寄存器p0-pn 变量寄存器:v0-vm
刚开始学有点懵逼了 什么是局部变量寄存器 参数寄存器啊 局部变量 参数 寄存器 单个分出来都知道是什么 但是和在一起就蒙了 可能当时秀逗了 例如一个方法 java代码 其中name是参数 whoname是变量 所以对应的p1是name 参数寄存器 v0是whoname 变量寄存器(android studio 中java2smali插件可以方便的将java转smali 安装好插件后点击Build ->compile smali即可)
private void getname(String name){
String whoname="nihao";
if (name.equals(whoname)){
}
}
smali代码
.method private getname(Ljava/lang/String;)V
.registers 4
.param p1, "name" # Ljava/lang/String;
.prologue
.line 16
const-string v0, "nihao"
.line 17
.local v0, "whoname":Ljava/lang/String;
invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_8
.line 20
:cond_8
return-void
.end method
Dalvik 字节码类型
dalvik字节码类型分为两种 :基本类型和引用类型
处理对象和数组属于引用类型,其他的java类型都是基本类型
Dalvik | java |
---|---|
V | void |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
L | 类 |
[ | 数组 |
类的表示
在Daivlk汇编代码中以Lpackage/name/ObjectName;的形式表示 例如String 表示为 Ljava/lang/String; 最后以分号结尾
方法的表示
在Dalvik汇编代码中以
Lpackage/name/ObjectName;->MethodName(III)Z
的形式表示 例如我们常见的activity中的oncreate方法
protected void onCreate(Bundle savedInstanceState)
则表示为 onCreate为方法名,括号里的Landroid/os/Bundle为参数 最后的V为方法返回值类型
Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
字段的表示
字段的表示与方法类似 格式为
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
例如java中一个字段
String whoname;则表示为
Lcom/example/myapplication/MainActivity;->whoname:Ljava/lang/String;