實作自訂字體

在 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權限。