源码阅读----资源管理

arsc文件结构

参考两篇博文:第二篇较为详细
手把手教你解析Resources.arsc
Android6.0之App中的资源Rsources.arsc详解

总结一下:
arsc二进制文件的存储是基于块(chunk)的,每个块包含有数据头和数据两部分,块与块之间可以嵌套包含;
数据头指明了chunk的类型,头部大小,整个块的大小等等,同时也就界定了数据区。
一个arsc文件可表示为一个ResTable chunk,数据包含一个字符串常量池,和若干个package chunk;这个字符串常量池存储了资源对应的值(比如mipmap资源的路径)。
package chunk 数据包含两个字符串常量池(资源类型名称池和资源名称key值池);以及若干个typeSpec chunk,每个typeSpec代表这一种资源类型的资源数据。
每个typeSpec下又包含若干type chunk,代表了一种config下的资源

类结构

这里写图片描述

Resources对象创建

这里写图片描述

Context的getResources方法返回Resources对象,Resources的创建整个过程如上图所示。
Resources是一个封装类,主要功能实现都是由ResourcesImpl完成。创建Resources先要有ResourcesImpl,在ResourcesManager中维护有一个缓存mResourceImpls

/**
* A mapping of ResourceImpls and their configurations. These are heavy weight objects
* which should be reused as much as possible.
*/
ArrayMap<ResourcesKey, WeakReference<ResourcesImpl>> mResourceImpls

先会在缓存中查找,找不到就创建ResourcesImpl,ResourcesImpl关键的一个成员mAssets是AssetManager对象,AssetManager在本地层有对应的AssetManager(C++对象),负责资源文件arsc的解析操作。
创建ResourcesImpl前会完成AssetManager对象创建。
对某一个资源的选取需要根据设备配置(参考提供资源),Configuration定义了配置情况。在创建AssetManager对象后通过updateConfiguration更新配置。

总结:创建基本流程

1.在缓存中查找ResourcesImpl,没有找到转入2创建ResourcesImpl
2.创建AssetManager对象并通过addAssetPath添加资源,资源路径保存在c++层AssetManager的mAssetPaths中,创建ResourcesImpl,更新Configuration
3.创建Resources对象

资源获取流程

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yuanjw2014/article/details/78282908
今日推荐