Dalvik字节码 Smali语法

本文介绍了Dalvik虚拟机的字节码格式,详细讲解了Smali语言的数据类型、函数方法、字段语法及汇编指令等内容。适合希望深入了解Android应用底层原理的技术人员阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Dalvik的字节码主要有两种类型,原始类型和引用类型。引用类型包括对象和数组,除了引用类型其它的都是原始类型。

原始类型会单独用一张表表示。表格中的缩写它们实际存在dex文件中。在 dex-format.html文档中有定义 (dalvik/docs/dex/format.html in the AOSP repository)。

一、Smali数据类型
下面的表格是Java数据类型与Smali汇编数据类型的对应关系:


原始类型
Smali数据类型 Java数据类型
Vvoid -仅仅用于返回值
Zboolean  
Bbyte  
Sshort
Cchar
Iint
Jlong (64 bits)
Ffloat
Ddouble (64位)  

引用类型:包括对象类型和数组类型

对象类型表示方式:Lpackage/name/ObjectName; 

L表示它是一个对象,package/name/对象所在的包名,ObjectName是对象名,以分号结尾;这个与Java

中的package.name.ObjectName是等价的.例如,Ljava/lang/String;等价于java.lang.String。

例如:Ljava/lang/String 表示java.lang包名下的String类型

数组类型表示方式:一维数组:[类型。二维数组:[[类型。几维数组就有几个[,后面跟上原始数据类型或者对象类型即可。最多可表示255维数组。

例如:

[Z  表示一维布尔类数组,与java中的 boolean[] 等价

[B  表示一维字节类型的数组,与java中的byte[]等价

[S  表示一维短整型类型的数组,与java中的byte[]等价

[C  表示一维字符型数组,与java中的char[]等价

[I  表示一维整型数组,与java中的int[]等价

[J  表示一维长整型数组,与java中的long[]等价

[F  表示一维浮点型数组,与java中的float[]等价

[D  表示一维双精度浮点型数组,与java中的double[]等价

[[I  表示二维整型数组,与java中int[][]等价

[Ljava/lang/String 等价于Java中的String[]


二、Smali函数方法的语法:


Lpackage/name/ObjectName;->MethodName(参数类型)Z

函数包括函数名,参数类型和返回值类型. 虚拟机需要这些信息找到正确的方法。


例子如下:

Lpackage/name/ObjectName;->MethodName(III)Z
这个例子中, 你可以识别  Lpackage/name/ObjectName;   MethodName  明显的是方法名.  (III)Z是方法的签名 III是参数  (在这个例子中表示三个整型), Z  表示返回值为boolean类型. 方法参数中间没有分隔符

下面是一些更复杂的例子:

method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;

  在java中表示如下:

String method(int, int[][], int, String, Object[])

三、Smali字段语法:

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;


例如:Lcom/test/Dog;->name:Ljava/lang/String;

表示调用Dog类的实例中的java.lang.String类型的name 字段

四、Smali汇编指令,一个寄存器32位

操作码操作码名称解释说明例子
00nop无操作0000 - nop 
01move vx,vyvy的内容给vx0110 - move v0, v1
v1值给v0.
02move/from16 vx,vyvy的内容给vx. vy ,vy范围是v0-v65535,vx是v0-v255move/from16 v255,v60000
03move/16  
04move-wide  
05move-wide/from16 vx,vy vy的long/double类型的值给 vx. vy 的范围是0-2^16.vx是前256个寄存器.0516 0000 - move-wide/from16 v22, v0
Moves v0 into v22.
06move-wide/16  
07move-object vx,vyvy中的对象引用给vx.0781 - move-object v1, v8
Moves the object reference in v8 to v1.
08move-object/from16 vx,vyvy中的对象引用给vx, vy范围是v0-v65535,vx是v0-v2550801 1500 - move-object/from16 v1, v21
Move the object reference in v21 to v1.
09move-object/16  
0Amove-result vx 先前调用函数的返回值给vx0A00 - move-result v0
Move the return value of a previous method invocation into v0.
0Bmove-result-wide vx函数返回的 long/double结果值给 vx,vx+1。因为结果是64位需要两个32位存储0B02 - move-result-wide v2
Move the long/double result value of the previous method invocation into v2,v3.
0Cmove-result-object vx先前函数的返回值的引用给vx.0C00 - move-result-object v0
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值