Android资源管理概述

       我们知道Android系统跑在各种各样的设备上,它的运行环境极为复杂,比如不同的语言、不同的屏幕密度、大小和方向等等。为了保证良好的显示效果,在不同的环境下,我们应该提供不同的资源。但是这些资源该如何打包、组织、加载、管理呢。显然,把这么繁重的工作交给各个应用去做很不合适,那将会使得每个Android应用中都充斥着大量的资源适配的代码,丑陋且重复。为了解决这个问题,Android提供了统一的资源管理框架,我们只要按照框架的约定来组织资源,就可以实现在不写一行资源适配代码的情况下,完成资源适配的任务。 还有就是现在比较流行的动态加载、热修复、组件化等技术,都绕不开资源这个模块。因此,打算深入了解一下Android的资源管理机制。

       Android资源管理模块的主要功能包括对资源的分类、组织、编译、打包、加载、引用等。这些功能主要分布在AAPT和AssetManager两个module中。AAPT负责资源的组织、编译、打包这些工作,而资源的加载和引用则主要由AssetManager来实现。

       Android资源的总体来说可以分为两大类:Assets和res。

       Assets类型的资源,AAPT在编译打包的时候不会对它做任何的处理,当然也不会为它生成资源ID,我们要访问Assets类型的资源也就只能以文件名的方式来访问。

       res类型的资源,AAPT在编译的时候,会为它分配资源ID,我们访问的时候可以通过资源ID来访问。当然,也可以通过资源名称来访问,但是Android并不推荐这样做,因为这样要遍历整个key StringPool,并且对每个字符串做比较,效率极低。这里多说一句,所谓的资源ID,也就是我们经常使用的的R文件的本质是资源的一个索引。使用索引来访问,效率当然比遍历查询要高太多了。

       在res类型的资源当中,有一种raw类型的资源,AAPT除了为它生成资源ID外,也不会对它做特殊处理,类似的还有图片资源。其余的资源又可以分为XML类型的,比如:layout、drawable、anim、menu、xml等;还有values类型的,比如:string、integer、dimen、color等。在编译的时候,AAPT会将XML类型的资源编译成二进制的形式,建立字符串池,这样做的好处有很多,比如可以节约空间,在xml文件中android这个namespace会引用非常多次,但在字符串池里,只有一次;比如可以加快解析速度,因为它是基于索引的,而不是基于字符串比较的。

       对于values类型的资源,比如string、interger等,AAPT会直接把他们编译入Global String Pool,这也就是我们解压APK后,看不到res/values/目录的原因了。

       总结起来就是,AAPT会对不同的资源类型做不同程度的处理,以达到节约空间,节省时间的目的。

       资源的组织,大家都比较熟悉了,对于不同的config,创建不同的目录,提供不同的资源,如想更加详细地了解,大家可以参考老罗的文章。

        资源的编译,这是AAPT的重头戏,主要包括了,对values资源的编译、对XML资源的编译(包括AndroidManifest.xml)、R文件的生成,.d(依赖文件)的生成、resources.arsc(资源索引表)的生成等。另外,我们还会重点讨论这些过程中涉及到的一些不常见的概念及其相关处理过程,比如overlayPackage、Bag资源、privateSymbolPackage、Res_lib等。其实,一般情况下,Android源生的AAPT足以满足我们对应用资源的编译需求,当我们需要定制自己的系统资源的时候才可能涉及到对AAPT的修改。不过,需求是多种多样的,多了解其原理和代码,没准儿哪天就派上用场了呢。

        资源的加载和引用,则是由AssetManager来完成的。当Zygote创键完虚拟机,进入java世界后,fork出其它子进程前,它会加载许多系统的东西,系统资源也会在这个时候被加载。当这些资源被加载后,它们会被缓存起来,当需要再次引用时,就可以不用重新创键了。其实,fork出来的每一个子进程,都是已经加载过系统资源的了。这部分代码在framework/base/core/java/com/android/internal/os/ZygeteInit.java中:

资源的提前加载

        其中,mResources = Resources.getSystem();这行代码会通过AssetManager来加载系统的资源,具体就不在这里详述了,后面我们会有文章专门讨论。在讨论AssetManager的过程中,我们会也会讲一些不常用的概念和机制,比如OverlayPackage的加载机制、Idmap、DynamicReference、Theme的实现等。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值