老铁们,大家好,相信还有很多朋友对于深入解析与学习Android资源管理框架(Asset Manager)和的相关问题不太懂,没关系,今天就由我来为大家分享分享深入解析与学习Android资源管理框架(Asset Manager)以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
Android应用程序作为移动客户端应用程序,也毫不奇怪地将代码逻辑和界面资源分离,但其资源管理方式与传统Web应用程序、PC客户端应用程序和iOS应用程序不同。这种比较有点复杂,因为Android 应用程序可能在不同大小和密度的设备上运行。接下来我们重点讨论Android应用程序资源的组织和管理。
我们先来看看Android应用程序资源的分类。 Android应用程序资源可以分为两大类,即assets和res:
1. assets。
asset类资源放在项目根目录的assets子目录下。一些原始文件保存在其中,可以以任何方式组织。这些文件最终都会被完整的打包在apk文件中。如果我们想在程序中访问这些文件,我们需要指定要访问的文件名。例如,假设assets目录下有一个名为filename的文件,则可以使用以下代码来访问它:
AssetManager am=getAssets();
InputStream is=assetset.open("文件名");
2. res。
res资源放在项目根目录的res子目录下。其中保存的大部分文件都会被编译并分配资源ID。这样我们就可以在程序中通过ID来访问res类的资源了。 res资源根据用途不同可以进一步分为以下9个子类型:
animator。
此类资源以XML文件形式保存在res/animator目录下,用于描述属性动画。属性动画通过改变对象的属性来实现动画效果。比如通过不断修改物体的坐标值来实现物体运动动画。比如通过不断修改物体的Alpha通道值来实现物体的渐变效果。
anim。
此类资源以XML 文件形式保存在res/anim 目录中,用于描述补间动画。补间动画与属性动画不同。它不是通过修改对象的属性来实现的,而是在对象的原始形状或位置的基础上实现变换。例如,对对象进行旋转变换,可以获得旋转动画,又例如,对对象进行缩放变换,获得缩放动画。从数学上讲,就是根据对象的原始形状或位置应用变换矩阵来实现动画效果。请注意,在动画执行过程中,对象的属性保持不变,我们看到的只是它的变形副本。
color。
此类资源以XML 文件形式保存在res/color 目录中,并使用选择器来描述对象的颜色状态。例如,我们可以定义一个选择器,指定一个对象在不同状态下显示不同的颜色。对象的状态可以分为7 种类型:按下、聚焦、选中、可检查、选中、启用和window_focused。
drawable。
此类资源以XML 或Bitmap 文件形式保存在res/drawable 目录中,用于描述可绘制对象。例如,我们可以在里面放置一些图片(.png、9.png、jpg、gif)作为程序界面视图的背景图片。请注意,此目录中保存的位图文件可能会在打包过程中进行优化。例如,不需要超过256 色的真彩色PNG 文件可能会转换为仅具有8 位调色板的PNG 面板,从而允许对图像进行无损压缩,以减少图像使用的内存资源。
layout。
此类资源以XML文件形式保存在res/layout目录下,用于描述应用程序界面布局。
menu。
此类资源以XML 文件形式保存在res/menu 目录中,用于描述应用程序菜单,例如选项菜单、上下文菜单和子菜单。
raw。
此类资源以任意格式的文件保存在res/raw目录中。和assets资源一样,它们都被打包在apk文件中,不做任何改变,但是它们会被分配资源ID,所以我们可以在程序中通过ID来访问它们。例如,假设res/raw目录下有一个名为filename的文件,在编译过程中,分配给它的资源ID为R.raw.filename,那么可以使用下面的代码来访问它:
资源res=getResources();
输入流=res .openRawResource(R.raw.filename);
values。
此类资源以XML文件的形式保存在res/values目录下,用于描述一些简单的值,如数组、颜色、大小、字符串和样式。一般来说,这六个不同的值存储在名为arrays.xml、colors.xml、dimens.xml、strings.xml 和styles.xml 的文件中。
xml。
此类资源以XML文件的形式存储在res/xml目录下,一般用于描述应用程序的配置信息。
需要注意的是,上述9种资源文件中,除了Bitmap文件的raw类型资源和drawable类型资源外,其他资源文件都是文本格式的XML文件。它们在打包过程中将被编译成二进制格式。 XML 文件。这些二进制格式的XML文件每个都有一个字符串资源池,用于保存文件中引用的每个字符串,包括XML元素标签、属性名称、属性值以及所有其他文本值使用的字符串。这样,文本格式XML文件中原来放置字符串的每个位置都被替换为索引到字符串资源池的整数值。这样做有两个好处:
A. 文件占用更小。
例如,假设在原始文本格式的XML文件中有四个地方使用了同一个字符串,那么在最终编译出来的二进制格式的XML文件中,字符串资源池只有一个字符串值,而这四个地方使用了相同的字符串。引用它只占用一个整数值。
B. 解析速度更快。
由于在二进制格式的XML文件中,所有的XML元素标签和属性值都是使用整数来描述的,因此,在解析过程中,不再需要进行字符串解析,这样可以提高解析速度。
另外需要注意的是,每个res资源编译打包后,都会被分配一个资源ID。这些资源ID最终将被定义为Java常量值并保存在R.java文件中。它与应用程序的其他源文件一起编译到程序中,这样我们就可以通过程序或资源文件中的这些ID常量来访问指定的资源。
接下来我们看一下应用资源的组织。应用程序资源的组织方式有18 个维度,如图1 所示:
图1 应用资源的组织结构.jpg 注意,图1中的表格来自官方文档。其详细描述请参考:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources。这里需要说明的一点是,表中的18个维度是按照优先级从大到小的排列的。这种优先顺序可以帮助系统根据机器的本地配置在应用程序资源目录中找到最合适的资源。使用。
具体来说,Android资源管理框架按照图2所示的算法流程在应用程序资源目录中选择最合适的资源:
图2 应用资源匹配算法.png 注意,图2中的算法流程图来自官方文档。其详细说明请参考:http://developer.android.com/guide/topics/resources/providing-resources.html# BestMatch。我们也通过上述官方文档中的例子来说明上述应用资源匹配算法的执行过程。
假设应用程序的可绘制资源按以下方式组织:
可绘制/
可绘制-en/
可绘制-fr-rCA/
可绘制端口/
可绘制-en-notouch-12key/
可绘制端口ldpi/
drawable-port-notouch-12key/并且应用程序在配置如下的设置下运行:
区域设置=en-GB
屏幕方向=端口
屏幕像素密度=hdpi
触摸屏类型=notouch
初级文本输入法=12key 根据图2所示的算法,Android资源管理框架按照以下步骤选择drawable资源:
步骤1、排除与设备配置冲突的drawable目录,即drawable-fr-rCA目录,因为设备设置的语言是en-GB。可绘制/
可绘制-en/
可绘制端口/
可绘制-en-notouch-12key/
可绘制端口ldpi/
drawable-port-notouch-12key/Step 2. 从MMC 开始,选择一个资源组织维度来过渡Step 1 筛选后的剩余目录。
步骤3.检查步骤2中选择的维度是否有对应的资源目录。如果没有,则返回步骤2继续处理。如果是,则继续执行步骤4。在我们的示例中,必须重复步骤2,直到检查了语言维度。
步骤4. 消除不包含步骤2 中选择的资源维度的目录。在我们的示例中,我们要消除不包含语言en 的目录:
可绘制-en/
可绘制端口/
drawable-en-notouch-12key/Step 5、继续执行步骤2、步骤3、步骤4,直到找到最匹配的资源目录,即剩下最后一个目录。在我们的例子中,下一个要检查的维度是屏幕方向。由于设备的屏幕方向是port,所以所有不包含port资源维度的目录都会被淘汰:drawable-en-port/最后剩下的目录只有drawable-en-port,所以是最匹配的资源目录。此时所有的drawable类型资源都可以从该目录获取。
注意,当我们编译打包应用程序资源时,会生成一个resources.arsc文件。该文件记录了所有应用程序资源目录信息,包括每个资源名称、类型、值、ID以及配置的Dimension信息。我们可以把这个resources.arsc文件想象成一个资源索引表。该资源索引表可以根据资源ID和设备配置信息,快速在应用程序的资源目录中找到最匹配的资源。
最后,我们可以通过图3来总结一下应用资源的编译、打包和搜索过程:
图3 应用程序资源的编译、打包和搜索过程.jpg 从图3中我们可以看到:
A. 除了原样打包到APK中的assets和res/raw资源外,其他资源都会被编译或处理。
B. 除资产资源外,其他资源都会分配资源ID。
C、打包工具负责资源的编译和打包。编译完成后会生成resources.arsc文件和R.java。前者保存了一个资源索引表,后者定义了各个资源ID常量。
D.应用程序配置文件AndroidManifest.xml也会被编译成二进制XML文件,然后打包到APK中。
E.应用程序在运行时通过AssetManager访问资源,或者通过资源ID,或者通过文件名。
在以下系列文章中,我们重点关注三个关键场景:
1、应用资源的编译、打包过程;
2、应用资源的初始化过程;
3、应用资源的搜索过程。
通过这三个场景,我们可以基本了解Android系统的资源管理框架,敬请期待。不过,在阅读本系列文章之前,希望读者能够先了解一下Android应用资源的基础知识,因为本系列文章不会落入这些基础知识。详细信息可以参考以下官方文档:
A.http://developer.android.com/guide/topics/resources/index.html。
【深入解析与学习Android资源管理框架(Asset Manager)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想了解一下Android开发中资源文件是如何管理的,这个标题很吸引人!
有15位网友表示赞同!
一直听说Android项目里需要用到AssetManager,但还没弄明白它的用处,这篇文章刚好可以让我入门。
有18位网友表示赞同!
我已经开始学习Android开发了,希望能通过这篇介绍了解下Asset Manager的工作原理,这样对资源管理会更清楚。
有19位网友表示赞同!
资源管理是Android开发中很重要的部分,想要写出高质量的程序就要搞懂这些基础知识。
有16位网友表示赞同!
这个标题听起来很有深度,应该能涵盖Asset Manager的使用场景和常见问题吧?
有17位网友表示赞同!
学习计划很棒!这样能够更有目标性地学习。希望能看到详细的步骤和示例代码。
有15位网友表示赞同!
希望这篇文章也能介绍一下Asset Manager和其他资源管理工具的不同之处。
有13位网友表示赞同!
我一直在尝试开发一些Android应用,希望这篇介绍能帮助我更有效率地使用Asset Manager!
有15位网友表示赞同!
看来学习计划很完整,正好可以跟着学一阶段 AssetManager 的知识!
有15位网友表示赞同!
感谢分享这篇文章,应该能让很多开发者更理解如何高效地管理 Android 资源。
有9位网友表示赞同!
我对Android开发比较感兴趣,希望能通过这篇介绍深入了解Asset Manager的应用。
有17位网友表示赞同!
学习计划里包含什么内容呢?可以先透露一下吗?
有16位网友表示赞同!
我已经开始写自己的 Android 应用程序了,这篇介绍可能很对我用得上哦!
有16位网友表示赞同!
希望文章能够解释清楚如何处理不同类型的资源文件,例如图片、音频和文本。
有20位网友表示赞同!
Asset Manager 是Android开发中必不可少的知识点,学习起来可能会有些挑战吗?
有9位网友表示赞同!
分享这篇文章真是太棒了,能让我快速了解 Asset Manager 的基本概念!
有11位网友表示赞同!
不知道文章会介绍一些实际案例吗?实战经验很有帮助啊!
有18位网友表示赞同!
期待看到具体的代码示例,这样更容易理解Asset Manager的操作流程。
有10位网友表示赞同!
希望这篇文章能够解答我最关心的问题: 如何使用 Asset Manager 来加载外部文件资源?
有5位网友表示赞同!