實現自定義字體回退

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

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

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

FontUpdater是可以被信任的一個可插拔字體更新signature|privileged權限檢查。該FontUpdater與相通FontManagerService獲得,安裝,刪除或更新當前的系統字體設置。所述FontUpdater可以傳遞通過進程間通信(IPC)機制的新的字體文件的內容。所述FontManagerService保存內容到世界可讀存儲位置,例如在/data/fonts文件。這個存儲是受保護的。它可以通過寫FontManagerService由SELinux策略。

Application類推出,它通過系統字體設置為的參數bindApplication方法;然後它初始化字體設置以供應用程序進程使用。

實現自定義字體

一些 OEM 安裝或替換 AOSP 中的字體文件以顯示其品牌。 Android 12 支持此功能,但增加了在設備中保持表情符號字體更新的要求。不修改或更新表情符號字體文件的 OEM 不需要使用此功能。

谷歌更新了字體文件,特別是NotoColorEmoji通過大湄公河次區域核心文件,所以不要修改或刪除NotoColorEmoji.ttf從文件/system分區,並沒有從中刪除/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,並指定glyph ID = 0在您的CMAP。

使用區旗:如果目標字形是區旗,指定字形的ID作為一個未知的國家代碼。 (使用country code = "ZZ"

製作豆腐雕文:如果你想使用一個可以顯式地指定豆腐字形ID。如果指定glyphID = 0 ,相關的應用程序解釋,由於“字形不可用”。例如,當你使用這個屬性,那麼Paint#hasGlyph應用程序返回false

替換或修改其他字體文件

更換或修改其它字體,定制類似於用於修改tff文件當地市場的需求。運行時在 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允許您的應用程序的更新功能。