Manifest文件结构
一. 头部信息
- 文件魔数:4bytes 0x00080003
- 文件大小:4bytes
二、String Chunk
这个Chunk主要存放的是AndroidManifest文件中所有的字符串信息
字段名 | 含义 | 长度 |
---|---|---|
ChunkType | StringChunk的类型 | 固定四个字节:0x001C0001 |
ChunkSize | StringChunk的大小 | 四个字节 |
StringCount | StringChunk中字符串的个数 | 四个字节 |
StyleCount | StringChunk中样式的个数,在实际解析过程中,这个值一直是0x00000000 | 四个字节 |
Unknown | 位置区域,在解析的过程中需要略过 | 四个字节 |
StringPoolOffset | 字符串池的偏移值,这个偏移值是相对于StringChunk的头部位置 | 四个字节 |
StylePoolOffset | 样式池的偏移值,这里没有Style,所以这个字段可忽略 | 四个字节 |
StringOffsets | 每个字符串的偏移值 | 大小应该是:StringCount*4个字节 |
SytleOffsets | 每个样式的偏移值 | 大小应该是SytleCount*4个字节 |
字符串是utf-16的宽字符,每个字符占2个字节,每个字符串块的前两个字节标识字符串的长度,以0x0000结尾,长度不包括尾部的结束符0x0000。
三、ResourceIdChunk
这个Chunk主要是存放的是AndroidManifest中用到的系统属性值
对应的资源Id(0x01xxxxxx),比如android:versionCode中的versionCode属性
字段名 | 含义 | 长度 |
---|---|---|
ChunkType | StringChunk的类型 | 固定四个字节:0x00080180 |
ChunkSize | StringChunk的大小 | 四个字节 |
ResourceIds | 资源ID列表 | (chunkSize-8)/4 * 4bytes |
Package ID相当于是一个命名空间,限定资源的来源,0x01属于系统资源命名空间,0x7f属于应用程序资源命名空间,所有位于[0x01, 0x7f]之间的Package ID都是合法的,而在这个范围之外的都是非法的Package ID。
Type ID是指资源的类型ID。资源的类型有animator、anim、color、drawable、layout、menu、raw、string和xml等等若干种,每一种都会被赋予一个ID。
Entry ID是指每一个资源在其所属的资源类型中所出现的次序。注意,不同类型的资源的Entry ID有可能是相同的,但是由于它们的类型不同,我们仍然可以通过其资源ID来区别开来。
系统资源对应id的xml文件所在路径:frameworks\base\core\res\res\values\public.xml
,版本越高的Sdk定义的ID项越多。
ID | 资源类型type |
---|---|
0x0101xxxx | attr |
0x0102xxxx | id |
0x0103xxxx | style |
0x0104xxxx | string |
0x0105xxxx | dimen |
0x0106xxxx | color |
0x0107xxxx | array |
0x0108xxxx | drawable |
0x0109xxxx | layout |
0x010axxxx | anim |
0x010bxxxx | animator |
0x010cxxxx | interpolator |
0x010dxxxx | mipmap |
0x010exxxx | integer |
0x010fxxxx | transition |
0x0110xxxx | raw |
四、StartNamespaceChunk
这个Chunk主要包含AndroidManifest文件中的命令空间的内容,Android中的xml都是采用Schema格式的,所以肯定有Prefix和Uri的。(xml格式有两种:DTD和Schema)
字段名 | 含义 | 长度 |
---|---|---|
ChunkType | Chunk的类型 | 固定四个字节:0x00100100 |
ChunkSize | Chunk的大小 | 四个字节 |
LineNumber | 在AndroidManifest文件中的行号 | 四个字节 |
Unknown | 未知区域 | 四个字节 |
Prefix | 命名空间的前缀(在字符串中的索引值),比如:android | 四个字节 |
Uri | 命名空间的uri(在字符串中的索引值):比如: |