Posts Dex文件格式分析
Post
Cancel

Dex文件格式分析

在刚学习Java的时候我们都会写一个HelloWorld的示例。

1
2
3
4
5
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello,world!");
    }
}

然后通过javac命令编译成字节码,然后调用java命令机执行字节码。我们如何像java一样在命令行里直接在命令行输出Hello,world!呢。具体要执行如下操作:

.class文件转换成.dex文件

1
dx --dex --output=HelloWorld.dex HelloWorld.class

dex文件推送到sd卡上。

1
adb push HelloWorld.dex /sdcard/

执行字节码

1
2
adb shell
dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld

Dex文件格式概貌

Dex文件结构如下图所示。

img

Dex文件对应的对象是DexFile,定义如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct DexFile {
    /* directly-mapped "opt" header */
    const DexOptHeader* pOptHeader;
    /* pointers to directly-mapped structs and arrays in base DEX */
    const DexHeader*    pHeader;
    const DexStringId*  pStringIds;
    const DexTypeId*    pTypeIds;
    const DexFieldId*   pFieldIds;
    const DexMethodId*  pMethodIds;
    const DexProtoId*   pProtoIds;
    const DexClassDef*  pClassDefs;
    const DexLink*      pLinkData;
    /*
     * These are mapped out of the "auxillary" section, and may not be
     * included in the file.
     */
    const DexClassLookup* pClassLookup;
    const void*         pRegisterMapPool;       // RegisterMapClassPool
    /* points to start of DEX file data */
    const u1*           baseAddr;
    /* track memory overhead for auxillary structures */
    int                 overhead;
    /* additional app-specific data structures associated with the DEX */
    //void*               auxData;
};

首先从宏观上来说dex的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。各个成员的解释如下:

数据名称解释
headerdex文件头部,记录整个dex文件的相关属性
string_ids字符串数据索引,记录了每个字符串在数据区的偏移量
type_ids类似数据索引,记录了每个类型的字符串索引
proto_ids 
field_ids存储成员变量信息,包括变量名、类型等
method_ids存储成员函数信息包括函数名、参数和返回值类型等
class_defs存储类的信息
dataDex文件重要的数据内容都存在data区域里。一些数据结构会通过如xx_off这样的成员变量指向文件的某个位置,从该位置开始,存储了对应数据结构的内容,而xx_off的位置一般落在data区域里
link_data理论上是预留区域,没有特别的作用。

头部信息

查看刚才生成的dex的十六进制

image-20190927104628357

Header的大小固定为0x70,偏移地址从0x000x70

Header包含的字段和各个字段的长度如下表所示:

addressNamesize/byteValue
0Magic Number8 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

string_ids数据结构

type_ids数据结构

proto_ids数据结构

field_ids数据结构

method_ids数据结构

class_defs数据结构

参考

This post is licensed under CC BY 4.0 by the author.

Activity的启动流程

Improve App Performance With Kotlin Coroutines

Comments powered by Disqus.