AndroidManifest文件格式
首先如何查看编译后的AndroidManifest文件?
hexdump -C /Users/panda/Downloads/478643861/file/AndroidManifest.xml
效果如下:
Xml整个上的内容
头信息
每个xml文件都有这2个信息,分别表示:
- 文件魔数:4个字节,固定不变0X000803
- 文件大小,4个字节
String Chunk
存放的是manifest文件中所有的字符串信息。
每个字段的解释如下:
- ChunkType:StringChunk的类型,固定四个字节:0x001C0001
- ChunkSize:StringChunk的大小,四个字节
- StringCount:StringChunk中字符串的个数,四个字节
- StyleCount:StringChunk中样式的个数,四个字节
- Unknown:位置区域,四个字节,在解析的过程中,这里需要略过四个字节
- StringPoolOffset:字符串池的偏移值,四个字节,这个偏移值是相对于StringChunk的头部位置
- StylePoolOffset:样式池的偏移值,四个字节,这个偏移值是相对于StringChunk的头部位置
- StringOffsets:每个字符串的偏移值,整个的大小应该是:StringCount*4个字节
- SytleOffsets:每个样式的偏移值,整个的大小应该是SytleCount*4个字节
实例说明:
后面那一坨都是每个字符串的偏移量,那每个字符串怎么表示的呢?
ResourceId Chunk
存放的是manifest中用到的系统属性对应的资源Id。
- ChunkType:ResourceIdChunk的类型,固定四个字节:0x00080108
- ChunkSize:ResourceChunk的大小,四个字节
- ResourceIds:ResourceId的内容
实例说明:
知识补充: 资源id是有固定的格式的,具体是:PackageID + TypeID + EntryID
StartNamespaceChunk / EndNamespaceChunk
manifest文件中的命令空间的内容。
- ChunkType:Chunk的类型,固定四个字节:0x00100100
- ChunkSize:Chunk的大小,四个字节
- LineNumber:在AndroidManifest文件中的行号,四个字节
- Unknown:未知区域,四个字节
- Prefix:命名空间的前缀(在字符串中的索引值),比如:android
- Uri:命名空间的uri(在字符串中的索引值)
EndNamespcaeChunk跟StartNamespcaeChunk结构是一样的,除了ChunkType的16进制不同之外。
实例:
start:
end:
StratTagChunk
manifest中的标签信息。
- ChunkType:Chunk的类型,固定四个字节:0x00100102
- ChunkSize:Chunk的大小,固定四个字节
- LineNumber:对应于AndroidManifest中的行号,四个字节
- Unknown:未知领域,四个字节
- NamespaceUri:这个标签用到的命名空间的Uri,四个字节
- Name:标签名称(在字符串中的索引值),四个字节
- Flags:标签的类型,四个字节,比如是开始标签还是结束标签等
- AttributeCount:标签包含的属性个数,四个字节
- ClassAtrribute:标签包含的类属性,四个字节
- Atrributes:属性内容,每个属性算是一个Entry,这个Entry固定大小是大小为5的字节数组: [Namespace,Uri,Name,ValueString,Data],我们在解析的时候需要注意第四个值,要做一次处理:需要右移24位。所以这个字段的大小是:属性个数54个字节
EndTagChunk
对应StartTagChunk的End。
实例说明: