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

3.1.2 Dex文件格式的概貌

图3-3所示为Dex文件格式的概貌。

其各个成员解释如下。

·首先是Dex文件头,很重要,类型为header_item。

·string_ids:数组,元素类型为string_id_item,它存储和字符串相关的信息。

图3-3 Dex文件格式概貌

·type_ids:数组,元素类型为type_id_item。存储类型相关的信息(由TypeDescriptor描述)。

·field_ids:数组,元素类型为field_id_item,存储成员变量信息,包括变量名、类型等。

·method_ids:数组,元素类型为method_id_item,存储成员函数信息包括函数名、参数和返回值类型等。

·class_defs:数组,元素类型为class_def_item,存储类的信息。

·data:Dex文件重要的数据内容都存在data区域里。一些数据结构会通过如xx_off这样的成员变量指向文件的某个位置,从该位置开始,存储了对应数据结构的内容,而xx_off的位置一般落在data区域里。

·link_data:理论上是预留区域,没有特别的作用。

和Class文件格式比起来,Dex文件格式的特点如下。

·有一个文件头,这个文件头对正确解析整个Dex文件至关重要。

·有几个xxx_ids数组,包括string_ids(字符串相关)、type_ids(数据类型相关)、proto_ids(主要功能就是用于描述成员函数的参数、返回值类型,同时包含ShortyDescriptor信息)、field_ids(成员域相关)和method_ids(成员函数相关)。

·data区域存储了绝大部分的内容,而data区域的解析又依赖于header和相关的数据项。

下面单独用一节来介绍Dex文件各数据项的内容。