小米多主题思路分析-重定向资源篇

首先声明一下,该文章分析参考小米MIUI多主题一文中的介绍:Android系统如何实现换肤及MIUI
文档名称:《MIUI主题风格_一种Android系统换肤功能的设计》大家可自行搜索下载。
另外考虑到排版的问题,在分析源码的过程中只会留下关键的点,太长的源码会以“代码段x.x{}”替代省略。但是主要的逻辑我会描述清楚。
1 什么是系统主题?
这一段这样的对话: 领导问我,主题能替换哪些资源啊?
我不加思索的回答:文字,颜色,图片,恩…… 还有大小。
领导说: 还有呢?
我思考了一会儿,内心来了一段对白: 折腾了这么久,就支持这几个? 是不是忽略了哪些地方,但是实在没有想到别的。
我就回答: 是的。
领导走了,剩下我呆呆的看着车载界面,试图从里面找到我忽略的地方?
不知道多久,突然我反应过来, 界面除了文字,颜色,图片,大小,还有别的吗?
恩是的,这就是主题,就是替换系统和应用图片,文字,颜色,大小,使其展示一种新的风格。

2 要实现系统主题应该思考哪些问题呢?
2.1 资源重定向:什么是资源重定向呢?
简单来说就是在应用通过Resources类获取资源的过程中,把应该返回的图片A/颜色A ,替换成主题的 图片B/颜色B。从而实现界面风格的变化。
2.2 即时刷新:什么是即时刷新呢?
在切换主题的时候,设备的当前页面以及之前用户打开过的页面,都要刷新一下,保证这些页面切换为新的主题风格。
因为不方便分析已经实现的源码,所以接下来的两篇文章都只是分析Android源码以及思路。先来看资源重定向的思路。

3 资源重定向:
先看一张重定向流程图:
这里写图片描述
其实思路就是这样的应用通过Resources类来获取资源的时候拦截一下,返回主题的资源。要想知道如何拦截,必须了解一下Resources类, 通过它取资源的流程,然后分析重定向的思路。
按照以下4个方面来分析:
3.1 Android apk资源的一些理解。
3.2 访问资源Resources类的构建。
3.3 通过Resources获取资源的流程(以获取图片为例)。
3.4 关于资源重定向思路分析

3.1 Android apk资源的一些理解:
R文件: 应用在编译完成后会生成一个R文件,在应用中定义的资源基本在R文件中对应一个Id,使用资源的时候都是通过这个ID来查找的。每个ID由三部分组成: packageID+TypeID+EntryID
resources.arsc文件: 这个文件是一个资源配置表,通过R文件中生成的资源ID可以从这个资源配置表中找到这个ID对应配置信息。这些配置信息中可以知道ID的资源类型,对应的名称/资源路径等等。
这里大概了解这两点就行了,足以应对主题功能了,其他更多的大家可以取看罗升阳的博客关于资源的介绍。

3.2 访问资源Resources类的构建:
应用都是通过Resources类来访问资源的,而主题就是希望能偷梁换柱替换资源,所以有必要了解一下Resources这个类。先看一张图整体了接Resources类相关:
这里写图片描述
ResourcesManager: 一个进程可以运行多个应用,也就是说可能存在多个Resources对象,所以ResourcesManager负责管理当前进程的所有Resources对象。
mActiveResources: ResourcesManager的成员变量,保存Resources对象。
Resources: 其实它只是对外提供一个访问资源的封装类,封装了AssertManager对象。
AssertManager(java层): 他只是封装了native层的AssertManager对象。
AssertManager(native层): 实际访问资源的类,下面是他的三个成员变量。
AssetPath: 表示资源的路径,一般包含两个, 一个是Framework-res.apk系统资源的路径(默认添加)另一个是,App所在的路径。
ResTable: 资源表,第一次获取资源的时候,会根据AssetPath给定的路径,读取路径中resources.arsc文件。
ResTable_Config: 当前设置的资源配置信息,在获取资源的过程中,会检查当前的配置信息,获取正确的资源信息。这个配置信息的值就是,语言,屏幕分辨率ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值