實施自定義字體

在 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文件中。該存儲受到保護。根據 SELinux 策略,它只能FontManagerService編寫。

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 中修改表情符號字體,則無需採取任何操作。如果您想自定義表情符號字體,請使用以下部分中的說明。

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

要將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

替換或修改其他字體文件

替換或修改其他字體的定制方式與針對本地市場需求修改TTF文件的定制方式類似。運行時在 AOSP 中更新的未知字體文件將被忽略,並且不會更新。 Google 會忽略您設備中的未知字體。這包括從 AOSP 中的原始字體修改而來的字體文件。

雖然字體更新是由 Google 在 GMS Core 中完成的,但通用的字體更新機制是向所有 OEM 開放的。 OEM 可以使用滿足先決條件簽署字體文件進行運行時字體更新中的步驟安裝其他字體更新程序。

滿足先決條件

字體更新機制使用fs-verity Linux 內核功能。驗證您的設備是否符合fs-verity並將證書包含在您的設備中。

簽名字體文件

由於字體文件是有風險的資源,因此必須使用可信密鑰對其進行驗證。仔細檢查所有要更新的字體文件,並使用您的私鑰進行簽名。簽名必須與fs-verity兼容。

進行運行時字體更新

FontManger系統應用程序執行字體更新。 FontManager應用程序提供最新安裝的系統字體狀態以及使用簽名更新字體文件的功能。要調用更新應用程序,請將UPDATE_FONT signature|privileged權限添加到您的應用程序白名單清單中

向您的應用程序的更新程序功能提供UPDATE_FONT signature|privileged權限。