Apk解析之 —— AndroidManifest.xml

本篇解析AndroidManifest.xml文件,参考文章:Reference
项目源码:ApkParser

Manifest文件结构

一. 头部信息

  1. 文件魔数:4bytes 0x00080003
  2. 文件大小: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(在字符串中的索引值):比如:
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值