Android资源管理框架(Asset Manager)简介

Android应用程序主要由两部分内容组成:代码和资源。资源主要是指与UI相关的东西,例如UI布局、字符串、图片等。代码和资源分开可以使得应用程序在运行时根据实际需要来组织UI。这样就可以使得应用程序只需要编译一次,就可以支持不同的UI布局。这种特性使得应用程序在运行时可以适应不同的屏幕大小和密度,以及不同的国家和语言。 
    首先看Android应用程序资源的分类,主要分为两大类:分别是assets和res:
1)assets
    assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,这些文件最终会被原封不动地打包到apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设我们在assets目录下有一个名称为filename的文件,那么就可以使用以下代码来访问它:
AssetManager am = getAssets();
InputStream is = am.open("filename");

2)res
    res资源放在工程目录的res子目录下,它里面保存的文件大多数都会被编译,并且会被赋予资源ID,这样我们就可以在程序中通过ID来访问res类的资源。res类资源按照不同的用途可以进一步分为9种子类型:
  • animator。以XML文件保存在res/animator目录下,用来描述属性动画。
  • anim。以XML文件保存在res/anim目录下,用来描述补间动画。
  • color。这类资源以XML文件保存在res/color目录下,用来描述对象颜色状态选择子。例如,我们可以定义一个选择子,规定一个对象在不同状态下显示不同的颜色,对象的状态可以是pressed、focused、selected等。
  • drawable。这类资源以XML或Bitmap文件保存在res/drawable目录下,用来描述可绘制对象。我们可以在里面放置一些图片(.png,9.png,.jpg, .gif),用来作为城乡视图的背景图。
  • layout。以XML文件保存在res/layout目录下,用来描述应用程序界面布局。
  • menu。以XML文件保存在res/menu目录下,描述应用程序菜单。
  • raw。这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原封不动地打包在apk文件中,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。例如,假设在res.raw目录下有一个名称为filename的文件,并且它在编译过程,被赋予的资源ID为R.raw.filename,那么就可以用以下代码来访问它:
Resources res = getResources();
InputStream is = res.openRawResource(R.raw.filename);
  • values。这类资源以XML文件保存在res/values目录下,用来描述一些简单值,例如,数组、颜色、尺寸、字符串、样式值,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。
  • xml。这类资源以XML文件保存在res/xml目录下,一般就是用来描述应用程序的配置信息。
注意:上述9中类型的资源文件,除了raw类型资源,以及Bitmap文件的drawable类型资源外,其他资源文件均为文本格式的xml文件,它们在打包的过程中,会被编译成二进制格式的xml文件。这些二进制格式的xml文件分别有一个字符串资源池,用来保存文件中引用到的每一个字符串,包括xml元素标签、属性名称、属性值,以及其他的一切文本值所使用到的字符串。这样原来在文本格式的xml文件中的每一个放置组字符串的地方,在二进制格式的xml文件中都被替换成一个索引到字符串资源池的整数值。这样做有两个好处:
    A、文件占用更小。例如在原来的文本格式中xml文件中,有四个地方使用的都是同一个字符串,那么在最终编译出来的二进制格式的xml文件中,字符串资源池只哟一份字符串值,而引用它的地方只各占用一个整数值。
    B、解析速度更快。由于在二进制格式的xml文件中,所有的xml元素标签和属性等值都是使用整数来描述的。因此,在解析过程中,就不再需要进行字符串解析,这样就可以提高解析速度。

    另外还需要注意的是,每一个res资源在编译打包完成之后,都会被分配一个资源ID,这些资源ID最终被定义为Java常量值,保存在一个R.java文件中,与应用程序的其他源文件一起被编译到程序中,注意我们可以在程序或者资源文件中通过这些ID常量来访问指定的资源。

  程序资源的组织方式有18个维度,18个维度是按照优先级从最大到最小排列的,这个优先级次序可以帮助系统根据机器的本地配置来在应用程序资源目录中找到最合适的资源来使用。 

Android资源管理框架(Asset Manager)简介_第1张图片



  Android资源管理框架按照下面表示的算法流程,在应用程序资源目录中选择最合适的资源: 

Android资源管理框架(Asset Manager)简介_第2张图片



编译及打包过程

    在编译和打包应用程序资源的过程中,会生成一个resources.arsc文件,这个文件记录了所有的应用程序资源目录的信息,包括一个资源名称、类型、值、ID以及所配置的维度信息。可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源。
    应用程序资源的编译、打包以及查找过程:

Android资源管理框架(Asset Manager)简介_第3张图片


通过上图,可以知道:
A、除了assets和res/raw资源会被原封不动地打包进apk,其他的资源都会被编译或者处理。
B、除了assets资源之外,其它的资源都会被赋予一个资源ID。
C、打包工具负责编译和打包资源,编译完成之后,会生成一个resources.arsc文件和一个R.java文件,前者保存的是一个资源索引表,后者定义了各个资源ID常量。
D、应用程序配置文件AndroidManifest.xml同样会被编译成二进制的xml文件,然后再打包到APK里面。
E、应用程序在运行时通过AssetManager来访问资源,或者通过资源ID来访问资源,或者通过文件名来访问资源。







你可能感兴趣的:(Android资源管理框架)