resources.arsc
- Android 软件开发过程中有个重要的目录,即 app 工程下的 java/res 目录。这里存放了软件使用的各种类型的资源文件。这些资源文件在编译成 APK 时会被统一打包存放在 APK 的 res 目录。其中,jpg、png 图片文件按照原样存放,layout、drawbale、color 目录的 xml 配置文件会以 AXML 格式存放,所有的文件在打包时会以原来的文件名保存。连接程序代码和资源的桥梁是 R.java,该文件由编译器自动生成,里面保存的是不同类型的资源的 ID 值。这些 ID 值要以一种方式定位自己属于哪个资源,而这正是 res/values/public.xml 要解决的问题。第二章中就是通过 res/values/public.xml 文件定位字符串“unsuccessed”所对应的 ID 值的
- 一个资源包含资源的名称、类型、值及所在的 Package。resources.arsc 包含不同语言环境中 res 目录下所有资源的类型、名称与 ID 对应的信息
ARSC 文件格式
- resources.arsc 文件的格式称“ARSC 文件格式”,在 APK 中只有 resources.arsc 文件用这种格式
- ARSC 使用的数据结构同样位于 ResourceTypes.h 文件中。和 AXML 一样,它表示数据块使用 chunk。ARSC 中也引用了不同的 AXML 中的数据结构。一个 ARSC 从整体结构上看,由文件头 ResTableHeader、资源项值字符串池 ResStringPool、Package 数据内容块 ResTablePackage 三部分线性地组成
- 分析 ARSC 文件格式,同样用 010 Editor。使用模板库中的 AndroidResource.bt 模板。该模板同时支持 AXML 和 ARSC 文件的解析
- 下面是一幅 ARSC 文件格式简图:
- ARSC 的内部细节比 AXML 复杂很多,主要体现在 Package 数据内容块部分,现在从头看起
- 首先是文件头 ResTableHeader,它使用 ResTable_header 结构体表示,定义:
struct ResTable_header {
struct ResChunk_header header;
uint32_t packageCount;
};
-
header 字段:类型是 ResChunk_header,这在 AXML 时学过。header 的 type 字段指向的类型为 RES_TABLE_TYPE,表示这是一个 ARSC 文件
-
packageCount 字段:指明该 ARSC 中包含多少个 Package 的资源信息,它对应 ARSC 文件中 Package 数据内容块 ResTablePackage 的个数,目前它的取值通常为 1
-
接着是资源值字符串池 ResStringPool,其中存放 APK 中所有资源项值的字符串内容。它的数