AndroidManifest.xml文件格式
结构详解
xml文件头
1 | typedef struct { |
4字节:魔数(类型标识+头部结构大小)
4字节:文件大小
字符串区块
1 | typedef struct { |
字符串区块头(和xml头结构一致)
2字节:类型标识
2字节:头部大小
4字节:字符串区块大小
4字节:字符串数目
4字节:样式数目
4字节:缺省位置
4字节:字符串池的偏移量(字符串池起始距离字符串区块头起始位置的偏移量)
4字节:样式池的偏移量
string_count * 4字节:string_count个字符串偏移信息块
style_count * 4字节: style_count个样式偏移信息块
字符串偏移信息块
1 | typedef struct { |
每个块只有4字节,记录对应字符串起始距离字符串池起始的偏移量
索引偏移信息块对应的字符串:
字符串位置=xml文件头大小+字符串池偏移量+对应字符串偏移信息(就是本块内的数据)
检查对应字符串是否是utf-8编码,解析结构不同
1 | typedef struct { |
资源区块头(和xml头结构一致)
2字节:类型标识
2字节:头部大小
4字节:资源区块大小
资源数量=(区块大小-8字节头部大小)/4(资源一项为4字节)
一个资源列表,资源为ID值,这些ID对应android中实际的资源。
一个ID值由PackageID、TypeID、EntryID组成。
CHUNK
1 | typedef struct { |
Chunk通用结构:
4字节chunk类型
4字节chunk大小
4字节行号
4字节未定义区
接下来会根据不同chunk类型,相对应不同结构
NAMESPACE START
命名空间开端
4字节Prefix,命名空间前缀(在字符串池中的索引值)
4字节Uri,命名空间的URI(在字符串池中的索引值)
TAG START
1 | int uri <read=AxmlStringById>; |
标签开端
4字节Uri,标签对应的命名空间的URI(在字符串池中的索引值)
4字节Name,标签名称(在字符串池中的索引值)
2字节attr_start,标识为标签开端
2字节attr_size,标识为单条属性大小
2字节attr_count,该标签属性数目
2字节idIndex,不明
4字节attr_class,标签类属性
attr_count*attr_count字节,属性内容列表
1 | typedef struct { |
4字节Uri,属性对应的命名空间的URI(在字符串池中的索引值)
4字节Name,属性名称(在字符串池中的索引值)
4字节str,属性值(在字符串池中的索引值)
8字节value包含data结构大小、data类型、data(在字符串池中的索引值)
完整template
1 |
|