一、换肤方案
目前,市面上Android的换肤方案主要有Resource方案和AssetManager替换方案两种方案。
其中,Resource方案是用户提前自定义一些主题,然后将指定主题对应的 id 设置成默认的主题即可。而AssetManager替换方案,使用的是Hook系统AssetMananger对象,然后再编译期静态对齐资源文件对应的id数值。
1.1 Resource方案
Resource方案的原理大概如下:
1、创建新的Resrouce对象(代理的Resource)
2、替换系统Resource对象
3、运行时动态映射(原理相同资源在不同的资源表中的Type和Name一样)
4、xml布局解析拦截(xml布局中的资源不能通过代理Resource加载,LayoutInflater)
此方案的优势是支持String/Layout的替换,不过缺点也很明显:
- 资源获取效率有影响
- 不支持style、asset目录
- Resource多出替换,Resource包装类代码量大
1.2 AssetManager方案
使用的是Hook系统AssetMananger对象,然后再编译期静态对齐资源文件对应的id数值,达到替换资源的目的。此种方案,最常见的就是Hook LayoutInflater进行换肤。
二、Resource换肤
此种方式采用的方案是:用户提前自定义一些主题,然后当设置主题的时候将指定主题对应的 id