Android换肤功能设计与实现(1)


    MIUI系统最具特色的功能就是系统级的主题换肤,能够更换任何可见的元素。像桌面ICON、桌面文件夹、桌面壁纸、APP中的各种图片资源、字体等等。如果一个ROM想像MIUI一样,支持这种功能的话,那么这个功能是如何实现的那。从功能实现角度划分,可以分成第三方也能换的,还有只有系统能换的。这里主要是Android系统开放的各种服务,实现换肤的功能。比如壁纸,铃声这些,通过系统的相关接口,可以实现对这些功能的更换。MIUI其它的换肤功能,主要是对APP资源的更换,这个功能应该说最具特色。下面主要对这个功能的实现及主题管理APP的开发中遇到的问题,进行一下说明,会持续几篇博客。

    从理论上讲,对APP更换资源(桌面也是APP),可以与特定应用定义相关接口,从而有针对性的实现对资源的更换。如桌面,现在市面上的很多桌面都支持自身的换肤功能。可以更换ICON图库、图标背板等等。如果以这种方式实现换肤功能的话,那么换肤模块就要与各个APP定义相关的接口,将对应的资源放于约定好的位置,通过Intent广播方式通知各个APP,使各个APP重新加载。但这样做势必增加各个APP的复杂程度,同时不能更新第三方APP的资源。 如果需要做到对ROM中任何APP都可以进行换肤,那么就需要深入到Android系统对资源的加载、与使用部分去寻找答案了。

    简单将Android系统提取资源的相关类关系如上图所示,在我们所使用的Activity的getResource调用的是Context这个虚基类的接口,而如果想对Context的具体实现有一个深入的了解,那么可以去看ContextImpl。简单介绍一下Android系统对资源的提取方式,Android中,对资源的加载,通过Context获取Resources,最后调用的是AssetManager的openNonAsset()加载资源。Android系统通过资源ID来标识不同的资源,ID大于0x01000000为系统资源,否则为app自带资源。通过包名来确定不同的资源包,读取资源文件。

    Android系统中所有的资源都是以文件夹压缩包的形式存在的,这就是Android的APP在编译是所做的事,我们知道在Android的APP中,所有的应用代码被编译为dex格式的文件,那res资源那,其实所有的资源文件只是简单地使用zip文件压缩到APK应用包中。在Android手机进行安装时,

其实过程就是 1:解压APK应用包。2.解析文件夹下的xml文件,向系统注册包信息。主要包括启动Activity文件名,应用包名。3.将APK包拷贝到/data/app文件夹,以包名命名。在/data/app下面的就是各个应用所对应的资源包了,其实就是apk包的拷贝。在资源加载过程中,通过应用包名确定资源包的位置。直接到/data/app下面查找相应的资源包。提取对应的资源文件。

特殊的几个资源包:

1.系统资源包,在/system/framework/framework-res

   2.系统应用资源包,其实系统应用与普通应用一样,都是通过包名来确定资源包的位置的,所不同的是系统应用是在系统编译时直接编译为Android.mk中指定的包名,并拷贝到/system/app下面的,不存在上面所说的安装应用、解析的部分。其资源包就是/system/app下面的APK本体。包名就是在编译时,在Android.mk中指定的名称。

 

以上对Android系统资源加载的过程进行了简单地描述,按着这条思路走,基本可以实现对资源选择加载及替换了。

由于本篇涉及到比较底层的东西,部分属于产品级核心,不能详述请见谅,接下来的几篇,主要会说一下主题管理APP的开发,会进行详细介绍。

 

 

                             ——欢迎转载,请注明出处 http://blog.csdn.net/zyplus——

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值