安卓dex 文件结构简要说明

#ifndef _DEX_FILE_HELPER_
#define _DEX_FILE_HELPER_
//此文件只是起帮助作用,帮助不太了解DexFile结构的了解一下DexFile相关结构,想更详细的了解还需要参考相关源码


//classes.dex 对应于一个结构 DexFile
//struct DexFile {
//    const DexOptHeader* pOptHeader;//opt 头结构指针
//    const DexHeader*    pHeader;//dex header结构指针
//    const DexStringId*  pStringIds;//所有字符串,类似于elf的字符串表,包含所有引用符号,函数、变量等
//    const DexTypeId*    pTypeIds;//类型例如Ljava/lang/String、I、[B等表明一种数据类型
//    const DexFieldId*   pFieldIds;//属性id,来自一个类内部属性,指向它的指针
//    const DexMethodId*  pMethodIds;//函数id,类似于函数指针概念
//    const DexProtoId*   pProtoIds;//函数原型,这个原型,包含指向字符串表的符号,包含传入参数类型,和返回值类型,例如VL
//    const DexClassDef*  pClassDefs;//指向class对象的指针,这个class的表现形式是一种结构,这个结构包含了类的访问属性,接口、来自文件、指向ClassCode的指针等、一看smali文件你就明白了
//    const DexLink*      pLinkData;//链接库指针,暂时为空
//    const DexClassLookup* pClassLookup;
//    const void*         pRegisterMapPool;//这个应该是系统提供的api级别的
//    const u1*           baseAddr;
//    int                 overhead;
//};

classdef是一个最外层的类结构体,就像房子(板楼(描述),在北京昌平(文件名位置),归昌平管(继承实现)),classdata就像房子真实样子(具体这个房子布局,几个房间,几个灯等等),codedata就相当于具体房间了(不同方法有不同的code,房子里有很多不同的房间),大致这么讲呵呵。

其中code_item 才是(包含)真正的dalvik解释的字节码。




//解析Dex文件,可以从头解析,也可以从mapItem解析,两者有相对于的关系,并且当dex file 被填充好时,头部以下的结构也都指向对应位置
//DexFile 例子 通过dexdump获取的
//Processing 'classes.dex'...
//Opened 'classes.dex', DEX version '035'
//DEX file header:
//magic               : 'dex\n035\0'
//checksum            : c04ea208
//signature           : 8182...4329
//file_size           : 905352
//header_size         : 112
//link_size           : 0
//link_off            : 0 (0x000000)
//string_ids_size     : 6068
//string_ids_off      : 112 (0x000070)
//type_ids_size       : 852
//type_ids_off        : 24384 (0x005f40)
//field_ids_size      : 1352
//field_ids_off       : 40968 (0x00a008)
//method_ids_size     : 5309
//method_ids_off      : 51784 (0x00ca48)
//class_defs_size     : 517
//class_defs_off      : 94256 (0x017030)
//data_size           : 794492
//data_off            : 110860 (0x01b10c)





//完整的Class结构,这个类比较简单


//////////////////////////////////////////////////////////////////////////////////////////////////////
//Class #1 header:
//class_idx           : 9
//access_flags        : 9729 (0x2601)
//superclass_idx      : 766
//interfaces_off      : 116956 (0x01c8dc)
//source_file_idx     : 2232
//annotations_off     : 905336 (0x0dd078)
//class_data_off      : 123492 (0x01e264)
//static_fields_size  : 0
//instance_fields_size: 0
//direct_methods_size : 0
//virtual_methods_size: 1
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//Class #1            -
//  Class descriptor  : 'Landroid/annotation/TargetApi;'
//  Access flags      : 0x2601 (PUBLIC INTERFACE ABSTRACT ANNOTATION)
//  Superclass        : 'Ljava/lang/Object;'
//  Interfaces        -
//    #0              : 'Ljava/lang/annotation/Annotation;'
//  Static fields     -
//  Instance fields   -
//  Direct methods    -
//  Virtual methods   -
//    #0              : (in Landroid/annotation/TargetApi;)
//      name          : 'value'
//      type          : '()I'
//      access        : 0x0401 (PUBLIC ABSTRACT)
//      code          : (none)
//  source_file_idx   : 2232 (TargetApi.java)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//class code data 就不拷贝了 太多
#endif

猜你喜欢

转载自blog.csdn.net/ylcangel/article/details/25823987