您的位置 首页 java

Android资源索引为什么要使用R.java和resources.asrc两个文件?

让我们试想一下,如果我们写代码引用本地资源,会怎样做呢?是不是在代码中直接插入资源的路径呢?我们大部分情况下都会这么做。

但是Android为什么没有这么做呢?让我们想想如果Android也是在代码中写死资源路径,那不同分辨率适配岂不是要在代码中处理,不同语言的处理也要在代码中判断。Android手机种类那么多,不同的语言种类那么多,如果这么做,开发者岂不很崩溃。

所以,Android就需要设计一种多资源适配的机制。

为了能让资源选择在开发者编写Java代码时透明,Android设计了R.java文件。R.java是一个Java端的资源索引文件,每个资源都有对应的名称和地址(当然,不同适配文件夹下的资源名称和地址是同一个)。在Android应用开发中,开发者仅需要使用R.java文件的名称,系统就自动找到该分辨率下,该语言下的最适合的图片。这对开发者来说岂不是很爽!

那我们又有疑问了,既然R.java文件仅是一个索引文件,并没有处理不同分辨率下不同资源的选择问题,那Android系统又是如何给我们选择合适的分辨率和语言资源的呢?

Android系统使用了resources.asrc文件来处理这个问题。

resources.asrc也是一个索引文件,不过它是一个二进制文件,由C++代码编译生成。通过resources.asrc,我们可以找到指定的资源文件夹中的资源文件。resources.asrc文件格式如下,大家先简单看看即可,给大家一个感官的认识。

那么,问题又来了,R.java是如何调用到resources.asrc,并由resources.asrc索引到具体的资源文件的呢?

在讲解这个问题之前,我们先来了解下Android应用的资源有哪些?它的整个资源加载机制是什么样的?

Android资源管理框架实际是由AssetManager和Resources两个类来实现的。其中,Resources类可以根据ID来查找资源,而AssetManager类根据文件名来查找资源。而一个资源ID对应的是一个文件,那么Resources类是先根据ID来找到资源文件名称,然后再将该文件名称交给AssetManager类来打开对应的文件的。如上图所示,Resources是通过resources.arsc把Resource的ID转化成资源文件的名称,然后交由AssetManager来加载的。

更细致的过程是这样的:

应用程序调用Resources将资源id传入,Resources将资源id经过初步处理传给AssetManager,AssetManager拿到资源id后通过jni将其传给android_util_AssetManager.cpp文件。而AssetManager在初始化的时候已经将resources.arsc文件加载进内存,并生成了资源索引表ResTable对象(参见我的另一篇文章: )。然后,根据id来查询这个ResTable表,找到资源具体的路径位置,从而将要找的资源加载进内存供使用。

文章来源:智云一二三科技

文章标题:Android资源索引为什么要使用R.java和resources.asrc两个文件?

文章地址:https://www.zhihuclub.com/178480.shtml

关于作者: 智云科技

热门文章

网站地图