前段时间遇到了一个非常怪异的关于 RRO (Runtime Resource Overlay)的问题, 涉及到了整个 Android 资源管理机制,所以索性就花时间来研究一下整个 Android Framework 对资源是如何管理的。
先抛出一个问题,比如我们在应用开发过程中,我们会通过如下代码来加载资源
this.getResources().getString(R.string.key_word)
这里的 this 一般值得是 Context(如 Activity 等), R.string.hello_world 是定义在 res/values 文件夹下面的资源。 问题是:这个应用程序在运行的时候,是直接从打包到这个 apk 里面的资源文件(resources.arsc) 里面获取资源来显示吗? 比如你在 res/values 里面定义了
<string name="key_word">hello world</string>
那么这个程序运行时显示的一定是 hello world 吗?
答案是否。这就涉及到 Android 系统的资源管理,包括资源的初始化,应用程序资源的加载等等。
接下来我将分为两个部分,来拆解 Android 的资源管理机制
- 资源的初始化. 好比我们在写 data class 的时候,必须提供 set 和 get 的方法。同理,Android的资源也是如此,也有 set 和 get 的过程,我把 set 的过程叫做资源的初始化
- 资源的加载. 资源的加载就如同 get 的过程,具体来说就是应用程序是如何一步一步获取到资源