カスタム フォントを実装する

Android 11 以前では、AOSP ( /system/fontsパーティション内) またはベンダー パーティション ( /product/fontsまたは/system/fontsパーティション内) でデバイスにインストールされたフォント ファイルを更新するには、OEM からのシステム アップデートが必要です。この要件は、絵文字の互換性に大きな影響を与えます。 Android 12 では、 FontManagerシステム サービスを使用して、インストールされているフォント ファイルを管理し、システムを更新せずにデバイスにインストールされているフォント ファイルを更新できます。

Android 12 には 3 つのプロセス インタラクションが備えられています。 FontManagerServiceFont Updater 、およびApplication

FontManagerService 、システム サーバー内の中央管理システムです。 FontManagerServiceユーザーごとの最新のシステム フォント設定を保存します。

FontUpdatersignature|privilegedアクセス許可チェックによって信頼されるプラグイン可能なフォント アップデーターです。 FontUpdater FontManagerServiceと通信して、現在のシステム フォント設定を取得、インストール、削除、または更新します。 FontUpdaterプロセス間通信 (IPC) メカニズムによって新しいフォント ファイルの内容を渡すことができます。 FontManagerService 、コンテンツを/data/fontsファイルなどの誰でも読み取り可能な記憶場所に保存します。このストレージは保護されています。これはFontManagerServiceによってのみ、SELinux ポリシーによって書き込むことができます。

Applicationクラスは起動時に、 bindApplicationメソッドの引数としてシステム フォント設定を渡します。次に、アプリプロセスで使用するフォント設定を初期化します。

フォントをカスタマイズする

一部の OEM は、ブランドを表示するために AOSP のフォント ファイルをインストールまたは置き換えます。 Android 12 ではこの機能がサポートされていますが、デバイスで絵文字フォントを最新の状態に保つための要件が​​追加されています。絵文字フォント ファイルを変更または更新しない OEM は、この機能を使用する必要はありません。

Google はフォント ファイル、特にNotoColorEmojiファイルを GMS Core を通じて更新するため、 /systemパーティションからNotoColorEmoji.ttfファイルを変更または削除したり、 /system/etc/fonts.xmlから削除したりしないでください。フォントをカスタマイズするには、次の 3 つの方法に注意してください。

  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 を実行すると、元のNotoColorEmoji.ttfの代わりにModified\NotoColorEmoji.ttfでサポートされている変更されたグリフが表示されます。 Google では次のことを推奨しています。

  • このフォントには必要なグリフのみが含まれています。
  • 将来の絵文字リリースで行われるデザイン修正をデバイスが受信できるように、未変更のグリフを元のNotoColorEmoji.ttfファイルに委任します。

グリフの削除: NotoColorEmoji.ttfファイルからグリフを削除するには、手順 1 と 2 に従い、cmap でglyph ID = 0を指定します。

地域フラグを使用する:ターゲット グリフが地域フラグの場合は、グリフ ID を不明な国コードとして指定します。 ( country code = "ZZ"を使用します。)

豆腐グリフを作成する:豆腐グリフ ID を使用したい場合は、明示的に指定できます。 glyphID = 0を指定すると、関連アプリはそれを「グリフは利用できない」と解釈します。たとえば、この属性を使用すると、 Paint#hasGlyphアプリはfalseを返します。

他のフォント ファイルを置換または変更する

他のフォントを置換または変更する場合のカスタマイズは、ローカル市場のニーズに合わせて TTF ファイルを変更する場合と同様です。実行時に 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権限をアプリのアップデーター関数に提供します。