由I9100字体客制化apk架构说起

众所周知,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中获取很多信息。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章