基于前文对安卓主题的全面理解,本文将通过活用主题的机制,通过重定向资源文件,达到换肤的效果。这样可以在不更改逻辑,不重新打包应用,只通过R.java中资源文件的id重定向,即可达到美化系统的效果。

    先简单介绍下重定向的原理:

    1、系统启动时,开机关键的核心服务,开启主题相关服务AssetRedirectionManagerService

       

android桌面主题开发 安卓主题原理_重定向

    该服务是主题的核心,用于重定向系统的资源引用,从而达到替换的效果。

    

android桌面主题开发 安卓主题原理_重定向_02

    以上列出了该服务的所有方法,主线通过getPackageRedirectionMap-》generatePackageRedirectionMap-》generateExplicitRedirections-》process,将id对应res资源的定向保存在map映射中,我们通过对该map的修改,即可达到替换的效果。

下面具体讲讲主题包开发的流程:

1、任何一个主题包的目录结构都包括Android.mk,AndroidManifest.xml和res文件夹,res大致包含以下内容

android桌面主题开发 安卓主题原理_android桌面主题开发_03

anim保存动画文件

color保存颜色值

drawable多用于存放selector文件

drawable-hdpi适配QHD分辨率并向上兼容

drawable-land-hdpi适配QHD横屏分辨率

nodpi适配时不会拉伸图片

drawable-320dp-hdpi适配480p(320*1.5)的手机

drawable-360dp-hdpi适配540p手机

drawable-360dp-xhdpi适配720p(360*2)的手机

drawable-xhdpi适配HD分辨率并向上兼容

drawable-xxhdpi适配FHD分辨率并向上兼容

drawable-zh-rCN-hdpi适配简体中文的资源,多用于图片上有汉字

drawable-zh-rTW-hdpi适配繁体中文的资源

mipmap-hdpi多用于QHD分辨率的应用图标

mipmap-xhdpi多用于HD分辨率的应用图标

values存放strings、dimen、标签形式的color、drawable文件,分辨率适配类似drawable,不赘述

xml存放配置文件和映射关系,该目录具体如下:


android桌面主题开发 安卓主题原理_主题_04







android.xml为framework中需要替换的资源,中间两个分别为待办事项和淘宝需要替换的资源,命名均为包名,redirections为重定向字典文件,内容如下:





android桌面主题开发 安卓主题原理_android_05

如淘宝,如要替换淘宝的资源,会从该列表中分析淘宝的包名,对应的关联文件com_taobao_taobao.xml去寻找要替换哪些图片。

android桌面主题开发 安卓主题原理_主题_06

在com_taobao_taobao.xml中,我们又看到了需要替换的资源只有icon(为淘宝资源包中图片的名称),要替换为drawable/com_taobao_taobao_icon(为当前主题包中的资源引用)。

android桌面主题开发 安卓主题原理_xml_07

而这个图片我们放置在主题包的drawable-hdpi下,这样就完成了整体的替换关系。