R 之初体验

R 文件可能是很多 Android 开发者既熟悉又陌生的存在。它无处不在,所有使用到资源的地方都离不开它。它又有些陌生,google 已经把它封装的很完美了,以至于很多开发者并不知道它是怎么工作的。那么我们今天就来揭开它神秘的面纱。

Untitled

这是一个资源的 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 位表示资源在此类型里面的编号。

Untitled

有了 id 之后,就可以去 resource.arsc 里面去查找到真正的资源,将 id 作为 key,就可以查到此 id 对应的资源。

R 文件的存在形式

在平常的开发流程中,我们大概可以将「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

首先我们来看一下最终生成的 apk 里面的 R