由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中獲取很多信息。






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