众所周知,I9100可以在设置--显示设置--字体风格里面改变系统字体。
android的系统字体位置在system/fonts文件夹下。而I9100无需root权限、只需安装字体apk包就可以实现更换系统字体,他是如何做到的呢
首先,先来看下字体apk包的组成,相当简单:
androidmanifest.xml
res/assets/fonts
res/assets/xml
.....
最主要的就是这三个地方
androidmanifest.xml声明字体apk包,以便让系统找到字体apk
声明的主要方式就是讲apk的package声明为com.monotype.android.font.*开头的package name
res/assets/fonts 放字体字库的地方
res/assets/xml 声明字体在设置字体风格的现实名字,并声明字体的文件、要替换的系统字体文件名。可以有多对。
<?xml version="1.0" encoding="utf-8"?>
<font displayname="Apple">
<sans>
<file>
<filename>Chococooky.ttf</filename>
<droidname>DroidSans.ttf</droidname>
</file>
<file>
<filename>Chococooky.ttf</filename>
<droidname>DroidSans-Bold.ttf</droidname>
</file>
</sans>
</font>
这样一个字体apk就可以生成了。
以上只说了客户端字体apk插件的结构。
接下来再说说,framework字体客制化服务端的架构
由于代码看不到,以下都只能靠猜测
首先服务端通过PackageManager搜索所有以com.monotype.android.font开头的apk包,并找到assets里面的xml,读取displayname,并以列表显示出来
换系统字体的一种方法可能是,在将系统字体的文件,用链接形式将apk的字库链接到系统字体。这样系统读取系统字体就变成读取apk里面的字体
xml中 <file></file>就表示一个映射对
目前大部分apk主题都采用apk包的插件形式来进行扩展,这样的好处很明显,就是不需要更新原来的apk来达到扩展自身的目的,而且这种形式的扩展结构上也十分清晰。
这样主要的实现方式就是利用androidmanifest.xml中的声明来让系统或者宿主apk来获取目前插件的情况。
具体的有,想三星字体apk的包声明方式,这种方式主要是application标签下面没有任何东西(它只需要一个字体文件和它的声明)。所以在package上面做文章。
还有的类似AccountManager和SyncManager一样,在services标签下的intent声明。
其实主流的就是在intent上面做文章。intent是android上很好的一种通信方式。可以在intent中获取很多信息。