8.2.2 应用资源的管理

在Android中,系统会按照层次结构来管理应用资源中的内容。如图8-2所示,每个应用的资源会统一放置在一张资源表中(Resource Table),在该表内包含了多个资源包(Resource Package Group),而每个资源包中又存放着不同资源类型(Resource Type)的数据,每种资源类型,会按照给定的资源配置(Resource Config)存放资源项(Resource Entity)。列表类型的资源项就是最终的值,而值类型的资源项指向一个资源文件的地址,需要进行加载来获取最终的值。

R类中的每个常量都是32位的整型数,不同位上的信息正好对应着上述的结构信息。如图8-2所示,整型数的高8位表示资源包的信息;而次高的8位,代表资源类型,比如09,就标识着该资源项的类型是字符串;最低的16位,则具体表示资源项的索引信息。不难看出,在这样的表示方法下,每个应用中最多可能包含256个资源包,每个资源包可有256种不同类型的资源,而每个类型下最多可有65536个资源项。

8.2.2 应用资源的管理 - 图1

图 8-2 R类常量值的命名及其与App._ap文件的映射关系

当通过R类定位资源时,应用会按照R类与资源结构对应的关系渐进地搜寻。先依据高16位的信息定位到资源项所在的资源包;然后利用次高8位找到对应的资源类别,在每个资源类别下,依据当前设备的信息寻找到最合适的资源配置;在此配置下,利用最低16位的索引信息最终可以定位到所需的资源项。

这些实现都是通过C++来完成的,在时间和空间的开销上都做了大量的优化,以提升应用访问资源的速度。