在 Android 11 及更低版本中,更新 AOSP(在/system/fonts
分區中)或供應商分區(在/product/fonts
或/system/fonts
分區中)中的設備安裝字體文件需要 OEM 進行系統更新。此要求對錶情符號兼容性有重大影響。在 Android 12 中,您可以使用FontManager
系統服務來管理已安裝的字體文件和更新設備安裝的字體文件,而無需系統更新。
Android 12 具有三個進程交互; FontManagerService
、 Font Updater
和Application
。
FontManagerService
是系統服務器中的中央管理系統。 FontManagerService
存儲最新的每用戶系統字體設置。
FontUpdater
是一個可插入的字體更新程序,受signature|privileged
權限檢查的信任。 FontUpdater
與FontManagerService
通信以獲取、安裝、刪除或更新當前系統字體設置。 FontUpdater
可以通過進程間通信 (IPC) 機制傳遞新的字體文件內容。 FontManagerService
將內容保存到世界可讀的存儲位置,例如/data/fonts
文件中。此存儲是受保護的。它只能由FontManagerService
編寫,由 SELinux 策略編寫。
當Application
類啟動時,它將系統字體設置作為bindApplication
方法的參數傳遞;然後它初始化字體設置以供應用程序進程使用。
實現自定義字體
一些 OEM 會在 AOSP 中安裝或替換字體文件以展示其品牌。 Android 12 支持此功能,但增加了保持設備中表情符號字體更新的要求。不修改或更新表情符號字體文件的 OEM 不需要使用此功能。
Google 會通過 GMS Core 更新字體文件,尤其是NotoColorEmoji
文件,因此請勿從/system
分區修改或刪除NotoColorEmoji.ttf
文件,也不要將其從/system/etc/fonts.xml
中刪除。請注意以下三種自定義字體的方法:
- 將
NotoColorEmoji.ttf
文件替換為 OEM 品牌的表情符號字體。 - 根據您當地的市場需求修改
NotoColorEmoji.ttf
文件。 - 替換或修改其他字體文件。
如果您沒有在 AOSP 中修改表情符號字體,則無需採取任何措施。如果要自定義表情符號字體,請使用以下部分中的說明。
用 OEM 品牌的表情符號字體替換 NotoColorEmoji.ttf
要將NotoColorEmoji.ttf
文件替換為 OEM 品牌的表情符號字體文件,請將表情符號字體放在字體回退鏈之前:
- 將您自己的字體(稱為
OEMCustomEmoji.ttf
)放在/system
分區中。 修改
/system/etc/fonts.xml
如下代碼:<family lang="ko"> <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> </family> <!-- ADD FOLLOWING LINE --> <family lang="und-Zsye"> <font weight="400" style="normal">OEMCustomEmoji.ttf</font> </family> <!-- END OF MODIFICATION --> <family lang="und-Zsye"> <font weight="400" style="normal">NotoColorEmoji.ttf</font> </family> <family lang="und-Zsym"> <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> </family>
針對本地市場需求修改 NotoColorEmoji.ttf
請按照以下步驟針對您當地的市場需求進行定制:
- 使用不同的名稱創建您自己的
NotoColorEmoji
文件;例如,將其命名為Modified\_NotoColorEmoji.ttf
。 - 將其放在原始
NotoColorEmoji.ttf
文件之前。
執行步驟 2 後, Modified\NotoColorEmoji.ttf
支持的修改字形將顯示,而不是原始的NotoColorEmoji.ttf
。谷歌建議如下:
- 僅在此字體中具有必要的字形。
- 將未修改的字形委託給原始
NotoColorEmoji.ttf
文件,以便您的設備接收在未來表情符號版本中所做的任何設計修復。
刪除字形:要從NotoColorEmoji.ttf
文件中刪除字形,請按照步驟 1 和 2,並在 cmap 中指定glyph ID = 0
。
使用區旗:如果目標字形是區旗,則將字形 ID 指定為未知國家代碼。 (使用country code = "ZZ"
。)
製作豆腐字形:如果要使用豆腐字形 ID,可以顯式指定。當您指定glyphID = 0
時,相關應用程序會將其解釋為“字形不可用”。例如,當您使用此屬性時, Paint#hasGlyph
應用程序會返回false
。
替換或修改其他字體文件
替換或修改其他字體的自定義方式與根據當地市場需求修改tff
文件類似。運行時在 AOSP 中更新的未知字體文件將被忽略,並且不會更新。 Google 會忽略您設備中的未知字體。這包括從 AOSP 中的原始字體修改的字體文件。
儘管 GMS Core 中的字體更新由 Google 完成,但一般字體更新機制對所有 OEM 都是開放的。 OEM 可以使用滿足先決條件、簽署字體文件和進行運行時字體更新中的步驟安裝其他字體更新程序。
滿足先決條件
字體更新機制使用fs-verity
Linux 內核特性。驗證您的設備是否符合fs-verity
標準並將證書包含在您的設備中。
簽署字體文件
由於字體文件是有風險的資源,因此必須使用受信任的密鑰對其進行驗證。仔細檢查所有要更新的字體文件,並使用您的私鑰簽名。簽名必須與fs-verity
兼容。
進行運行時字體更新
FontManger
System 應用程序執行字體更新。 FontManager
應用程序提供最新安裝的系統字體狀態以及使用簽名更新字體文件的能力。要調用更新應用程序,請將UPDATE_FONT signature|privileged
權限添加到您的應用程序許可名單和清單中。
為您的應用的更新程序功能提供UPDATE_FONT signature|privileged
。