Resource.arsc文件格式
Resource.arsc的文件格式的定义在:
frameworks\base\include\androidfw\ResourceTypes.h
Resource.arsc的内部结构是由一系列的chunk构成,主要分为以下几个chunk:
- TYPETABLE
- TYPEPACKAGE
- TYPE_STRING
- TYPETYPE
- TYPESPEC
头部信息
每个chunk开始都是头部信息,具体的数据结构定义如下:
struct ResChunk_header
{
// 是当前这个chunk的类型
uint16_t type;
// 是当前这个chunk的头部大小
uint16_t headerSize;
// 是当前这个chunk的大小
uint32_t size;
};
TYPETABLE —— 资源索引表头部
描述了Resources.arsc文件的大小和资源包的数量。
一个apk可以包含多个资源包,但是默认情况下只有一个,就是应用的包名所在的资源包。
字符串资源池 —— TYPE_STRING
这个chunk包含了所有package里定义的字符串,它更多字段的定义:
- stringCount:字符串的个数
- styleCount:字符串样式的个数
- flag:字符串的属性,可取值包括0x000(UTF-16),0x001(字符串经过排序)、0X100(UTF-8)和他们的组合值
- stringStart:字符串内容块相对于其头部的偏移
- stylesStart:样式块相对于其头部的偏移
- 字符串偏移数组 + StringContent:字符串偏移数组每个元素记录着每个字符串相对于StringContent开始的索引
- 样式偏移数组 + StyleContent:样式偏移数组每个元素记录着每个样式相对于StyleContent开始的索引
整个的结构:
Package数据块 —— TYPEPACKAGE
- id:包的ID,等于Package Id,一般用户包的值Package Id为0X7F,系统资源包的Package Id为0X01
- name:包名
- typeString:类型字符串资源池相对头部的偏移
- lastPublicType:最后一个导出的Public类型字符串在类型字符串资源池中的索引
- keyStrings:资源项名称字符串相对头部的偏移
- lastPublicKey:最后一个导出的Public资源项名称字符串在资源项名称字符串资源池中的索引
Type String Pool & Key String Pool
Type String Pool:资源类型字符串池。是一个package中用到的类型字符串,如:anim,id,layout; Key String Pool:资源项名称字符串池。
<string name="app_name">Test</string>
其中,app_name就是资源项名称字符串池记录的字符串。
整个的结构:
在紧接着Type String Pool和Key String Pool后是剩下的两个chunk,在这里Type Specification Trunk和Type Info Trunk分别对应 TYPESPEC和TYPETYPE。
类型规范数据块 —— TYPESPEC
类型规范数据块用来描述资源项的配置差异性。通过这个差异性描述,我们就可以知道每一个资源项的配置状况。知道了一个资源项的配置状况之后,Android资源管理框架在检测到设备的配置信息发生变化之后,就可以知道是否需要重新加载该资源项。类型规范数据块是按照类型来组织的,也就是说,每一种类型都对应有一个类型规范数据块。
资源类型项数据块 —— TYPETYPE
类型资源项数据块用来描述资源项的具体信息, 这样我们就可以知道每一个资源项的名称、值和配置等信息。 类型资源项数据同样是按照类型和配置来组织的,也就是说,一个具有n个配置的类型一共对应有n个类型资源项数据块。