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

3.2.2 string_id_item等

xxx_id_item包括string_id_item、type_id_item、proto_id_item、field_id_item和method_id_item这五种数据结构,它们对应为string_ids、type_ids、proto_ids、field_ids和method_ids数组元素的数据类型,图3-5所示为它们的数据结构表示。

图3-5 xxx_id_item的数据结构

图3-5中展示了dex文件中xxx_id_item的数据结构,下面是它们各字段的含义。

·string_data_item:utf16_size是字符串中字符的个数。Dex文件的字符串采用了变种的UTF8格式,对于英文字符和数字字符而言,都只占一个字节。data是字符串对应的内容。

·string_id_item:类似Class文件的CONSTANT_String类型,它只有一个成员string_data_off:用于指明string_data_item位于文件的位置,也就是索引。

·type_id_item:descriptor_idx是指向string_ids的索引。

·field_id_item:class_idx和type_idx是指向type_ids的索引,而name_idx是指向string_ids的索引。

·method_id_item:class_idx是指向type_ids的索引,proto_idx是指向proto_ids的索引,name_idx是指向string_ids的索引。

·proto_id_item:shorty_idx是指向string_ids的索引,return_type_idx是指向type_ids的索引,如果parameters_off不为0,则文件对应的地方存储类型为type_list的结构,用于描述函数参数的类型。

·type_item:type_idx是指向type_ids的索引。

·type_list:size表示list数组的个数,而list数组元素类型为type_item。函数的每一个参数都对应一个type_item元素。

此外还有几点内容请读者注意:

·string_ids、type_ids、proto_ids等都是图3-4中Dex文件结构的一部分,在代码中可通过数组来描述它们。

·对于proto_id_item,首先,它的成员域shorty_idx(也就是ShortyDescriptor字符串)已经描述了参数和返回值的类型,但这只是简单描述,比如所有引用类型都用"L"统一表示,所以ShortyDescriptor肯定无法完整描述那种参数或者返回值类型为引用类型的函数。为解决此问题,proto_id_item中的return_type_idx用来描述返回值的数据类型,而参数的类型则通过parameters_off域(如果取值不为0,则表示该函数有参数)指向一个type_list。这个type_list为每个参数都存储了对应的数据类型(通过type_item中的type_idx来索引type_ids中的元素)。