rsources.arsc格式详解(2020年)

首先我们说一下 为什么 要写这篇文章

  1. 网上关于 rsources.arsc 文件解析的文章 内容较老
  2. 很少对每个chunk的含义做解释,或者 解释比较含糊

rsources.arsc 文件解析文章里基本上都有一张‘神图’但是里面缺少了一些内容。所以我就在 这张图的基础上,重新画了一张,增加了一些内容,最后对 各个 chunk 中包含的内容进行讲解。

arsc.png

每一块的含义(顺序从左至右,从上到下)

ResTableHeader
  • RES_TABLE_TYPE:占用2 字节 ,表示 rsources.arsc 文件整块的类型
  • 头大小:占 两个字节,表示 RES_TABLE_TYPE + 头大小+ 块大小 + package数 一共占用的字节数 也就是 12个字节
  • 块大小:占 4字节 ,表示整个arsc内容块占用的字节数
  • package数:占 4字节,表示被编译的资源包个数,一般就一个 。不知道怎么样会有多个

下面为了方便我就不写 占用空间了。看图就可以一目了然

ResStringPool
  • RES_STRING_POOL_TYPE: StringPool的类型
  • 头大小:和ResTableHeader的头大小一样 所以占用 也就是 28个字节
  • 块大小:StringPool整块大小
  • 字符串数:可解析出字符串的个数
  • style数:可解析出style的个数 不知道是什么style,待研究
  • 标记:字符串的属性,可取值包括0x000(UTF-16),0x001(字符串经过排序)、0X100(UTF-8)和他们的组合值
  • 字符串起始位置 : 字符串 相对于 ResStringPool的偏移量
  • style起始位置:style 相对于 ResStringPool的偏移量
  • 字符串偏移数组:保存的是每个字符串的索引。可已通过 字符串个数 解析出来,也可以配合 字符串 解析出不同的字符串。
  • style偏移数组:保存的是每个style的索引。可已通过 style个数 解析出来,也可以配合 字符串 解析出不同的style。
  • 字符串:保存具体字符串的地方,有自己的格式,前两个字节记录了字符串长度,字符串以0或者00结尾(和编码方式(utf-8或者utf-16有关)) 存储的是layout,drawable 文件夹下文件的全路径 和 Strings.xml中的 值(key的话是存在 资源项名称字符串池中的)
    例如:
res/anim/abc_slide_in_bottom.xml

如果是 utf-8,则字符串以 0x00 结尾,开头前两个字节分别表示 u8len 和 u16len。如果是 utf-16,则字符串以 0x0000 结尾,开头前两个字节表示 u16len,没有 u8len 字段。(u16len 和 u8len,分别代表 UTF-8 和 UTF-16 下的字符串长度)

  • style:目前不太清楚保存的什么
ResTablePackage
  • RES_TABLE_PACKAGE_TYPE: ResTablePackage的类型
  • 头大小:ResTablePackage头部大小
  • 块大小:ResTablePackage整块大小
  • package id: 一般用户包的值为0X7F,系统资源包为0X01
  • package name:就是 APP中配置的包名
  • typeStrings: 资源类型字符串池 的偏移量(用于定位 资源类型字符串池)
  • lastPublicType:最后一个导出的Public类型字符串在类型字符串资源池中的索引,目前这个值设置为类型字符串资源池的元素的个数
  • keyStrings:资源项目名称字符串池 的偏移量(用于定位 资源项目名称字符串池)
  • lastPublicKey:最后一个导出的Public资源项名称字符串在资源项名称字符串资源池中的索引,目前这个值设置为资源项名称字符串资源池的元素的个数,目前没发现用途
  • typeIdOffset : 表示类型id的偏移 有可能存在也有可能不存在,我们需要判断头大小和 1-8所占空间是否相当,如果相等就说明不包含,如果不相等就说明包含。 如果包含的话 我们在解析 RES_TABLE_LIBRARY_TYPE 的typeId时要得到真正的 typeId 就要减去 typeIdOffset
  • 资源类型字符串池:用于存储资源类型,如 string,layout,drawable等 。他的结构和 ResStringPool 是一样的。
  • 资源项名称字符串池:用于存储 资源名称,比如layout的名字,string的名字,color的名字。也是一个 ResStringPool
ResTypeLibrary

是5.0之后才加入的,所以网上那么比较陈旧的文章中没有提及。它的作用就是正确的查找 ResTable_map_entry 类型Entry数据的parent。一般用不到,aapt在构建arsc文件时 会在 packageId 不是 0X7F(用户包) 才会加入。不一定存在

  • type= RES_TABLE_LIBRARY_TYPE
  • 头大小
  • 块大小
  • count:library的个数
  • packageid:library 的 id
  • package name:library的包名
ResTypeSpecChunk

用来描述资源项的配置差异性。系统根据不同设备的配置差异就可以加载不同的资源项(会有多个)

  • type=RES_TABLE_TYPE_SPEC_TYPE
  • 头大小
  • 块大小
  • type id : 资源类型id ,从1开始(对应于资源标识符中类型位的值)。 0无效。
  • 保留字段:一共两个占3个字节。 一个占一个字节一个占两个字节。默认都是0
  • entryCount:本类型的资源项个数(指名称相同的资源项的个数)
  • 资源 spce 数组:包含 资源项组spec数 个 uint_32 数组,数组每个元素都是用来描述资源项的配置差异性的。
ResTypeInfocChunk

资源项的具体信息,包括资源项的名称,类型,值和配置等等

  • type=RES_TABLE_TYPE_TYPE
  • 头大小
  • 块大小
  • type id : 资源类型id ,从1开始(对应于资源标识符中类型位的值)。 0无效。
  • flags :占用一个字节
  • 保留字段:一共占2个字节。
  • entryCount:一共有多少组
  • entriesStart:ResTable_entry偏移数组 的起始位置
  • config大小: ResTable_config所占大小
  • 运营商
    ....
  • 屏幕尺寸
  • entry偏移数组:记录偏移量 ,有可能是 -1,也就是不存在
  • entry大小:entry块的大小
  • flags: 如果为1的话,那就ResTable_map_entry 如果不是 那就是 不同的 entry(至于什么是 mapEntry 什么是 entry 后面会讲到
  • entry index:资源项目名称 在 资源项目名 字符串池中的索引。可以获取到 资源名称。比如 layout的名字
ResTable_entry
  • entry size:
  • 保留字段:
  • dataType:entry所包含的数据类型 ,String ,Float 等
  • data:(完整资源项目名称index (下标)) 通过这个再加上 全局资源项目池 就可以拿到对应 文件的全路径 如res/anim/abc_slide_in_bottom.xml 可能为无效值

用于表示这种 key/value形式的


1.png
ResTable_map_entry
  • parent :比如 style中 依赖的 的parent
  • count:包含 ResTable_entry 的数量
  • name: 比如 style中 依赖的 的name
  • Res_value大小:
  • 保留字段
  • 数据类型:在 ResourcesType.h文件的 Res_value 结构体中有定义 可以为 String Float等
  • data:(完整资源项目名称index (下标)) 通过这个再加上 全局资源项目池 就可以拿到对应 文件的全路径 如res/anim/abc_slide_in_bottom.xml 可能为无效值

用于表示这种形式的


2.png
  1. 本篇文章并没有对 rsources.arsc 文件的解析过程如果 想了解建议参考 https://github.com/NiLuogege/AndResGuardDebug.这个是我阅读 AndResGuard 源码时的项目,里面有详细的 注释
参考

1. https://www.jianshu.com/p/d62efb89b319

2. https://blog.csdn.net/chzphoenix/article/details/80567037

3. https://www.jianshu.com/p/93a38bebeaff

4. https://www.jianshu.com/p/3cc131db2002

5. 微信官方公众号出品

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280