当前位置: 首页 > 工具软件 > Dalvik > 使用案例 >

Dalvik

乔望
2023-12-01

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类型都是基本类型

Dalvikjava
Vvoid
Zboolean
Bbyte
Sshort
Cchar
Iint
Jlong
Ffloat
Ddouble
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;
 类似资料: