dex格式官方文档 写的很详细学习dex的唯一指南
根据官方文档整理的dex结构图
几个需要比较不好理解的知识点
LEB128
LEB128(“Little-Endian Base 128”)表示任意有符号或无符号整数的可变长度编码。每个 LEB128 编码值均由 1-5 个字节组成,共同表示一个 32 位的值。如下面表格所示 ,每个字节中的最高bit是标识信息,1表示还有后续字节,0表示结束,后面7bits是有效数据。将多个字节的该7bits从低到高组合起来就是所表示的整数。
LEB128分成有符号数和无符号数两种分别进行处理,不过,只是在编码和解码过程有些不同。
|第一个字节|第二个字节|第三个字节|第四个字节|第五个字节|
|:--:|
|0xxxxxxx|
|1xxxxxxx|0xxxxxxx|
|1xxxxxxx|1xxxxxxx|0xxxxxxx|
|1xxxxxxx|1xxxxxxx|1xxxxxxx|0xxxxxxx|
|1xxxxxxx|1xxxxxxx|1xxxxxxx|1xxxxxxx|0xxxxxxx|
MUTF-8
MUTF-8是在UTF-8的基础修改而来,使用单字节、双字节和三字节编码。解码后的MUTF-8变成两个字节的UTF-16
单字节
字节 | bit value | 说明 |
---|---|---|
第一个字节 | 0■■■■■■■ | bit6-0 等于ascii值 |
双字节
字节 | bit value | 说明 |
---|---|---|
第一个字节 | 110■■■■■ | bit10-6 |
第二个字节 | 10■■■■■■ | bit5-0 |
第二个字节和第一个字节的数据位拼成一个两个字节的UTF-16编码,其值0xC0和0x80之间
三字节
字节 | bit value | 说明 |
---|---|---|
第一个字节 | 1110■■■■ | bit15-12 |
第二个字节 | 10■■■■■■ | bit11-6 |
第三个字节 | 10■■■■■■ | bit5-0 |
组合成的UTF-16的编码值在0x80~0xFFFF之间
encoded_value
名称 | 格式 | 说明 |
---|---|---|
(value_arg << 5) | value_type | ubyte | 低五位表示value的类型、高三位表示的是value的size-1。value_type为0,表示value的size等于1 |
value | ubyte[] |