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。

实例说明:

results matching ""

    No results matching ""