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个类型资源项数据块。

results matching ""

    No results matching ""