R 文件可能是很多 Android 开发者既熟悉又陌生的存在。它无处不在,所有使用到资源的地方都离不开它。它又有些陌生,google 已经把它封装的很完美了,以至于很多开发者并不知道它是怎么工作的。那么我们今天就来揭开它神秘的面纱。
这是一个资源的 id,用 32 位的 int 表示。格式为 PPTTNNNN。 前 8 位 PP(Package) 表示资源所属包类型,0x7f 表示应用 Apk 包资源,0x01 表示系统包资源。 中间 8 位 TT(Type) 代表资源 id 的类型
0x02:drawable 0x03:layout 0x04:values 0x05:xml 0x06:raw 0x07:color 0x08:menu
最后 16 位表示资源在此类型里面的编号。
有了 id 之后,就可以去 resource.arsc 里面去查找到真正的资源,将 id 作为 key,就可以查到此 id 对应的资源。
在平常的开发流程中,我们大概可以将「project」分为三种。
其中 module 和 aar 对于 App 来说是一样的。
为了方便演示,我们构造了以下的工程
- app
- lib1
- lib2
- androidx.recyclerview:recyclerview:1.1.0
app 是 application 工程,依赖 lib1,lib1 依赖 lib2,lib2 依赖了 recyclerview。其中我们在 app、lib1、lib2 分别放置了 string 资源
- app <string name="string_from_app">string_from_app</string>
- lib1 <string name="string_from_lib1">string from lib1</string>
- lib2 <string name="string_from_lib2">string from lib2</string>
首先我们来看一下最终生成的 apk 里面的 R