Android DEX 文件格式解析

DexHeader

DexHeader备注
ubyte magic[8]dex文件的标识,一般为dex\n035\0
uint checksumadler32 检验用来确保DEX文件内容有没有损毁
ubyte signature[20]SHA-1 哈希值 20个字节
uint fileSize文件总大小
uint headerSizedex header 的大小,一般为70字节
uint endian Tag判断大小端 ,小端“0x12345678”,大端“0x78563412”
uint linkSizeLinkSection 的大小,如果为0,表示该DEX文件不是静态链接
uint linkOffLinkSection 的偏移地址
uint mapOffMapItem的偏移地址
uint stringIdSizeDexStringId(字符串列表)的个数
uint stringIdOffDexStringId(字符串列表)的偏移地址
uint typeIdsSizeDexTypeId(类型列表)的个数
uint typeIdsOffDexTypeId(类型列表)的偏移地址
uint protoIdsSizeDexProtoId(声明列表)的个数
uint protoIdsOffDexprotoId(声明列表)的偏移地址
uint fieldIdsSizeDexFileID(字段列表)的个数
uint fieldIdsOffDexFileID(字段列表)的偏移地址
uint methodIdsSizeDexMethodId(方法列表)的个数
uint methodIdsOffDexMethodId(方法列表)的偏移地址
uint classDefsSizeDexClassDef(类列表)的个数
uint classDefsOffDexClassDef(类列表)的偏移地址
uint dataSize数据段的大小

DexStringId

DexStringId备注备注备注
uint stringDataOffstringDataItem 的偏移地址//
/stringDataItemuleb128 utf16Size字符串大小
/stringDataItemubyte data字符串

DexTypeId

DexTypeId备注备注备注
typeIdItem存放dex中所有的类型//
/uint dexcriptor_idxDexStringId中的index

DexProtoId

DexProtoId备注备注备注
ptotoIdItem描述方法的圆形,即方法返回类型+方法参数
/uint shortIdx方法声明字符串指向DexStringId中的index,方法声明 = 返回类型 + 参数列表/
/uint returnTypeIdx方法返回类型 指向DexTypeId 的 index/
/uint parametersOffDexTypeList结构体的偏移地址/
/DexTypeList存放方法的参数列表/
/uint sizeDexTypeItem 的个数/
/DexTypeItem* listDexTypeItem 的数组/
/ushort typeIdx指向 DexTypeId 列表的 index/

DexFieldId

DexFieldId备注备注备注
fieldIdItem字段所属的类、字段的类型以及字段名//
/ushort classIdx字段所属类的类型,指向DexTypeId列表的index/
/ushort typeIdx字段的类型,指向DexTypeId 列表的index/
/uint nameIdx字段名,指向DexStringId 列表的index/

DexMethodId

DexMethodId备注备注备注
methodIdItemdex中所有的方法//
/ushort classIdx类的类型,指向DexTypeId的列表的index/
/ushort protoIdx声明的类型,指向DexProtoId 列表的index/
/uint nameIdx方法名,指向 DexStringId的列表index/

DexClassDef

DexClassDef备注备注备注
classDefItemdex中类的定义//
/uint classIdx类的类型,指向DexTypeId的列表的index/
/uint accessFlags访问标识,如 public/
/uint superclassIdx父类类型,指向DexTypeId列表的index/
/uint interfacesOff接口,指向DexTypeList 的偏移,如果没有则为0/
/uint sourceFieldIdx源文件名,指向DexStringId 列表的index/
/uint annotationsOff注解,指向 DexAnnotationsDirectoryItem 接口,或者为0/
/uint classDataOff指向DexClassData 结构的偏移,类的数据部分/
/classDataItem类使用到的各种数据/
/uleb128 staticFieldsSize静态字段个数/
/uleb128 instanceFieldSize实例字段个数/
/uleb128 directMethodsSize直接方法个数/
/uleb128 virtualMethodsSize虚方法个数/
/encodedField staticFieds静态字段/
/encodedField类中的字段/
/uleb128 fieldIdxDiffDexDieldId 列表的index/
/uleb128 accessFlags访问标识,如pubic/
/encodedField instanceFields实例字段
/encodedMethod directMethods直接方法/
/encodedMethod类中的方法/
/uleb128 methodIdexDiffDexMethodId列表的index/
/uleb128 accessFlags访问标识,如public/
/uleb128 codeOffcodeItem 的偏移地址/
/codeItem方法的逻辑代码/
/ushort registerSize代码使用到的寄存器个数/
/ushort insSize方法传入参数的个数/
/ushort outSize代码调用其他方法时需要的参数个数/
/ushort triesSizetry_item 结构的个数/
/uint debugInfoOff指向本段代码的的 debug 信息存放位置,是一个 debug_info_item 结构偏移地址/
/ushort insns代码指令/
/ushort padding值 为 0 ,用于对齐字节/
/tryItem tries异常相关/
/encodedCatchHandlerList异常相关/
/encodeMethod virtualMethods虚方法/
/uint staticValuesOff指向 DexEncodeArray 结构的偏移,记录了类中的静态数据,没有则为0/

DexMapList

DexClassDef备注备注备注
uint sizemapItem 的个数//
maptiem listmapItem 数组//
/ushort rtype一个枚举常量/
//kDexTypeHeaderItem = 0x0000/
//kDexTypeStringIdItem = 0x0001/
//kDexTypeTypeIdItem = 0x0002/
//kDexTypeProtoIdItem = 0x0003/
//kDexTypeFieldIdItem = 0x0004/
//kDexTypeMethodIdItem = 0x0005/
//kDexTypeClassDefItem = 0x0006/
//kDexTypeMapList = 0x1000/
//kDexTypeTypeList = 0x1001/
//kDexTypeAnnotationSetReList = 0x1002/
//kDexTypeannotationSetItem = 0x1003/
//kDexTypeClassDataItem = 0x2000/
//kDexTypeCodeItem = 0x2001/
//kDexTypeStringDataItem = 0x2002/
//kDexTypeDebugInfoItem = 0x2003/
//kDextypeAnnotationItem = 0x2004/
//kDexTypeEncodeArrayItem = 0x2005/
//kDexTypeAnnotationsDirectoryItem = 0x2006/
/ushort unused未使用,用于对齐/
/uint size指定类型的个数/
/uint offset指定类型数据的文件偏移/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值