實作自訂字型

從 Android 15 開始,可變字型 以更有效率和精細的方式執行執行階段本次更新後,供應商必須 將新的變數字型設定 font_fallback.xml敬上 而不是 fonts.xml,因為 fonts.xml 即將淘汰。 詳情請參閱「支援可變字型」。

在 Android 11 以下版本中,在 Android 開放原始碼計畫中更新裝置安裝的字型檔案 (位於 /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 方法的引數;然後初始化字型設定 供應用程式程序使用

支援可變字型

從 Android 15 開始,可變字型設定如下 指定於 font_fallback.xml敬上 格式如下:

<family lang="und-Ethi" supportedAxes="wght,ital">
    <font>NotoSansEthiopic-VF.ttf</font>
</family>

在此格式中,可變字型具有具有 額外的 supportedAxes 屬性。supportedAxes 屬性是 以逗號分隔的軸標記清單。取代為 Android 15,只有 wghtital 軸可 。

如未指定 supportedAxes 屬性,font 節點會做為 使用 axis 指定的可變字型的單一靜態字型 。

如果指定 supportedAxes 屬性,系統會動態建立 特定權重和樣式值在執行階段的字型執行個體。

開發人員可以使用 android.graphics.fonts.SystemFonts#getAvailableFonts Java API 或 ASystemFontIterator_open NDK API 可取得系統安裝的字型檔案清單。如需深入瞭解 支援這項更新的開發人員 API,請參閱 改良的 OpenType Variable Font APIbuildVariableFamily

自訂字型

部分原始設備製造商 (OEM) 會安裝或替換 Android 開放原始碼計畫中的字型檔案,展示自家品牌的產品。 Android 12 支援這項功能,但新增了 請務必確認裝置端的表情符號字型。不會修改或提供內容的原始設備製造商 (OEM) 更新表情符號字型檔案則不必使用這項功能。

Google 會透過 GMS 更新字型檔案,尤其是 NotoColorEmoji 檔案 Core,因此請勿修改或移除 NotoColorEmoji.ttf 檔案從 /system 分區,而且不從中移除 /frameworks/base/data/fonts/fonts.xml。 請注意,自訂字型的三種方式如下:

  1. NotoColorEmoji.ttf 檔案替換為 OEM 品牌的表情符號字型。
  2. 依據當地市場需求修改 NotoColorEmoji.ttf 檔案。
  3. 取代或修改其他字型檔案。

如果不是在 Android 開放原始碼計畫中修改表情符號字型,則無需採取任何行動。如果 如要自訂表情符號字型,請按照以下說明操作 專區。

將 NotoColorEmoji.ttf 替換成 OEM 品牌表情符號字型

如要將 NotoColorEmoji.ttf 檔案替換為 OEM 品牌的表情符號字型檔案,請按照下列步驟操作: 將表情符號字型放在字型備用鏈之前:

  1. /system 分區中放置您自己的字型,名稱為 OEMCustomEmoji.ttf
  2. 修改 /frameworks/base/data/fonts/fonts.xml (和 /frameworks/base/data/fonts/font-fallback.xml 英寸 Android 15 以上版本),如以下程式碼所示:

    <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。 Google 建議採用以下做法:

  • 這個字型中只有必要的字符。
  • 將未經修改的字符委派給原始的 NotoColorEmoji.ttf 檔案,即可 裝置會收到日後發布的表情符號修正的所有設計。

移除字符:如要從 NotoColorEmoji.ttf 檔案中移除字符,請遵循 步驟 1 和 2,並在 cmap 中指定 glyph ID = 0

使用區域性旗標:如果目標字符是區域標記,請指定 glyph ID 為未知的國家/地區代碼。(使用 country code = "ZZ")。

製作豆腐字符:您可以視需要明確指定豆腐字符 ID 使用這個 API指定 glyphID = 0 時,相關應用程式會將此解讀為 「無法取得字符」。舉例來說,使用這個屬性時, Paint#hasGlyph 應用程式會傳回 false

取代或修改其他字型檔案

如要取代或修改其他字型,自訂方式也類似 配合當地市場需求修改 TTF 檔案。不明的不明字型檔案 系統會忽略 Android 開放原始碼計畫 (AOSP) 更新中的更新版本,且該更新不會更新。Google 會忽略 電腦中安裝不明字型這包括從以下位置修改過的字型檔案: 開放原始碼 AOSP 中的原始字型

雖然字型更新是由 Google 在 GMS Core 中完成,但一般字型更新 所有原始設備製造商均可使用原始設備製造商 (OEM) 可使用 請參閱會議必要條件簽署字型檔案中的步驟操作。 和進行執行階段字型更新

Meet 必要條件

字型更新機制採用 fs-verity Linux kernel 功能,請確認 您的裝置符合「fs-verity」規定,並在裝置中加入憑證。

簽署字型檔案

字型檔案具有風險的資源,因此必須使用信任的金鑰驗證。 仔細檢查所有要更新的字型檔案,然後以 私密金鑰簽名必須與 fs-verity 相容。

更新執行階段字型

FontManager 系統應用程式會更新字型。「FontManager」應用程式 提供了最新安裝的系統字型狀態,並且能夠更新字型 簽章。如要呼叫更新應用程式,請將 UPDATE_FONT signature|privileged的權限: 應用程式許可清單資訊清單

UPDATE_FONT signature|privileged 權限提供給應用程式更新工具 函式。