實施自定義字體回退

在 Android 11 及更低版本中,更新 AOSP(在/system/fonts分區中)或供應商分區(在/product/fonts/system/fonts分區中)中的設備安裝字體文件需要 OEM 進行系統更新。此要求對錶情符號兼容性有重大影響。在 Android 12 中,您可以使用FontManager系統服務來管理已安裝的字體文件和更新設備安裝的字體文件,而無需系統更新。

Android 12 具有三個進程交互; FontManagerServiceFont UpdaterApplication

FontManagerService是系統服務器中的中央管理系統。 FontManagerService存儲最新的每用戶系統字體設置。

FontUpdater是一個可插入的字體更新程序,受signature|privileged權限檢查的信任。 FontUpdaterFontManagerService通信以獲取、安裝、刪除或更新當前系統字體設置。 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中刪除。請注意以下三種自定義字體的方法:

  1. NotoColorEmoji.ttf文件替換為 OEM 品牌的表情符號字體。
  2. 根據您當地的市場需求修改NotoColorEmoji.ttf文件。
  3. 替換或修改其他字體文件。

如果您沒有在 AOSP 中修改表情符號字體,則無需採取任何措施。如果要自定義表情符號字體,請使用以下部分中的說明。

用 OEM 品牌的表情符號字體替換 NotoColorEmoji.ttf

要將NotoColorEmoji.ttf文件替換為 OEM 品牌的表情符號字體文件,請將表情符號字體放在字體回退鏈之前:

  1. 將您自己的字體(稱為OEMCustomEmoji.ttf )放在/system分區中。
  2. 修改/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

請按照以下步驟針對您當地的市場需求進行定制:

  1. 使用不同的名稱創建您自己的NotoColorEmoji文件;例如,將其命名為Modified\_NotoColorEmoji.ttf
  2. 將其放在原始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