类型,方法和域
dalvik 字节码关于类型,方法和域的基本信息
类型 Types
dalvik字节码有两种主要的类型,值类型(原始类型)和引用类型。引用类型时对象和数组,其他的都是值类型。
原始类型用一个单独的字母表示。你可以从AOSP找到delvik字节码每个字母所代表的原始类型:dalvik/docs/dex-format.html
V | void - can only be used for return types |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long(64bits) |
F | float |
D | double(64bits) |
对象类型的格式类似于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; == String[]
方法 Methods
方法的描述总是包括:包含此方法的类型,方法的名称,参数的类型,返回的类型。所有的这些信息是为了虚拟机能够找到正确的方法,并能够在字节码上执行静态分析(达到检查和优化的目的)。
格式为:
Lpackage/name/ObjectName;->MethodName(III)Z
在这个例子中,你能够知道Lpackage/name/ObjectName是一个类型,很明显MethodName是方法名,(III)Z是改方法的特征,III是方法的三个参数(在这个例子中是三个整数),Z是改方法的返回值(bool)。
下面是一个复杂的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中,它的意思是:
String method(int, int [] [] , int, String, Object[] )
域 Fileds
域总是描述成包含:包含此域的类型,域的名字,域的类型。再一次说明,这样描述是为了虚拟机能够正确的找到这个域,同样的是为了执行字节码静态分析。
格式为:
Lpackage/name/ObjectName;->FileName:Ljava/langString;
这个很容易解释 ,三部分分别是:包名,域名,域名的类型。
参考官方原文: