深入理解Android:Java虚拟机ART
上QQ阅读APP看书,第一时间看更新

3.2.4 code_item

和code_item相关的数据结构如图3-8所示。

图3-8 code_item及相关数据结构

图3-8中为code_item及和它相关的数据结构,先来看code_item里的各个成员。

·registers_size:此函数需要用到的寄存器个数。

·ins_size:输入参数所占空间,以双字节为单位。

·outs_size:该函数表示内部调用其他函数时,所需参数占用的空间。同样以双字节为单位。

·insns_size和insns数组:指令码数组的长度和指令码的内容。Dex文件格式中JVM指令码长度为2个字节,而Class文件中JVM指令码长度为1个字节。

·tries_size和tries数组:如果该函数内部有try语句块,则tries_size和tries数组用于描述try语句块相关的信息。注意,tries数组是可选项,如果tries_size为0,则此code_item不包含tries数组。

·padding:用于将tries数组(如果有,并且insns_size是奇数长度的话)进行4字节对齐。

·handlers:catch语句对应的内容,也是可选项。如果tries_size不为零才有handlers域。

·code_item和Class文件中的Code属性类似。注意,code_item里的padding、tries和handlers成员都是可选项。也就是只有在代码中确实有try语句块的时候,这几个成员才存在(padding则是需要对齐的时候才存在)。

registers_size和ins_size进一步说明

(1)registers_size:指的是虚拟寄存器的个数。在art中,dex字节码会被编译成本机机器码,此处的寄存器并非物理寄存器。

(2)ins_size:Dex官方文档的解释是the number of words of incoming arguments to the method that this code is for,而在art优化器相关代码中,ins_size即是函数输入参数个数,同时也是输入参数占据虚拟寄存器的个数。registers_size-ins_size即为函数内部创建变量的个数。

到此,Dex文件格式就介绍差不多了,其余未介绍的内容请读者自行阅读参考资料[2]。下面来看Dex文件中的指令码。