dalvik字节码有两种类型:原始类型和引用类型。 对象和数组是引用类型,其他类型是原始类型。
V void,仅适用于返回类型
z布尔
B byte
S short
C char
I int
Jlong(64位) )。
F float
ddouble(64位)。
对象
Lpackage/name/ObjectName; 中选择另一种天花板类型。 前面的l表示这是对象类型,package/name/是对象所在的包,ObjectName是对象的名称,"; 中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。 相当于java的package.name.ObjectName。 例如,Ljava/lang/String; 相当于java.lang.String
数组的表示形式
[I——表示整数的一维数组,相当于java的int[]。
对于多维数组,只需增加[]即可。 [I相当于int[][],[[I相当于int [ ] [ ] ] ]。 请注意每一维最多255个。
对象数组的表示形式: [Ljava/lang/String; 表示字符串对象的数组。
方法
显示格式: Lpackage/name/ObjectName; -methodname(iii ) z
Lpackage/name/ObjectName; 表示类型,MethodName是方法名称。 III是参数(这里是三个整数参数),z是返回类型(bool类型)。
方法的参数一个接一个,之间是未分隔的。
更复杂的例子:
method(I[[iilJava/Lang/string; [Ljava/lang/Object; ) Ljava/lang/String;
在java中,您将看到以下内容:
字符串方法(int,int[],int,string,Object[] ) )
字段
显示格式:
Lpackage/name/ObjectName; - field name : ljava/lang/string;
包名称、字段名和每个字段类型。
寄存器
在dalvik字节码中,寄存器为32位,可以支持任何类型。 64位类型(Long型和Double型)用2个寄存器表示。
有两种方法可以指定一种方法可以使用的寄存器数量。 registers命令指定方法中的寄存器总数。 locals命令显示方法中非参数寄存器的数量。
方法的传参
调用该方法时,该方法的参数将放置在最后n个寄存器中。 1种方法有2个参数、5个寄存器(v0-v4 )时,参数配置在最后2个寄存器——v3和v4中。
非静态方法的第一个参数始终调用该方法的对象。
例如,非静态方法LMyObject; -callme(ii ) v有两个整数参数,另一个隐式LMyObject; 因为是参数,所以共有3个参数。 假设使用这种方法指定了5个寄存器(v0-v4 )。 使用. registers方式指定5个,或使用. locals方式指定2个。 即两个local寄存器、三个参数寄存器。 调用方法时,调用方法的对象(即this引用)存储在v2中,第一个整数参数存储在v3中,第二个整数参数存储在v4中。
静态方法是相同的,除了没有隐式this参数。
寄存器的命名方式
有——V命名方式和p命名方式两种。 p命名方式的第一个寄存器是方法的第一个参数寄存器。 下表说明了上一个示例如何包含五个寄存器和三个参数,以及这两种命名方法。
v0第一个本地注册器
第v12个本地注册器
v2 p0第一个参数注册器
v3 p1中的第二个参数注册器
v4p第二个参数注册器
用什么方法参照参数寄存器——他们都没有什么不同。
注意: baksmali缺省情况下对参数寄存器使用p命名方法。 如果要使用v命名方法,请使用-pl—no-parameter-registers选项。
使用p命名方法是为了避免以下缺点:如果以后尝试将寄存器添加到方法中,则必须对参数寄存器重新编号。
长/双精度值
Long和double类型为64位,需要两个寄存器。
例如,非静态方法LMyObject; -mymethod(ijz ) v,参数分别为LMyObject;int、long、bool。 因此,该方法中为了存储参数需要5个寄存器。
p0 this
p1 I
p2,p3 J
p4 Z
# static fields定义静态变量的标记
定义# instance fields实例变量的标记
#用于定义直接方法静态方法的标记
# virtual methods用于定义非静态方法的标记
构造函数的返回类型为v,名称为init。
if-eq p1,v0, cond_8表示如果p1和v 0相等,则执行cond _ 8的进程。
:cond_8
invoke-direct {p0},Lcom/paul/test/a; -d () v
调用com.paul.test.a中的d (方法
if-ne p1,v 0, cond_b表示如果不相等,则执行cond _ b的进程。
:cond_b
const/4v 0,0x 0
invoke-virtual {p0,v0},Lcom/paul/test/a; -setpressed(z ) v
invoke-super {p0,p1,p2},Landroid/view/View; - onkeyup (il Android/view/keyevent; (z
move-result v0
调用com.paul.test.a的setPressed方法,以调用父类View的onKeyUp方法,最后调用return v0
init和clinit区别
init是初始化构造函数
clinit是初始化静态成员的变量
class x { static loglog=log factory.get log (; //clinit private int x=1; //init X (()//init X (静态)//clinit ) ) )。
参考:
3358 BBS.pediy.com/showthread.PHP? t=151769
3358 stack overflow.com/questions/8517121/Java-VM spec-what-is-difference-between-init-and-clin it
3358 www.net mite.com/Android/my droid/dal vik/docs/dal vik-bytecode.html