カスタムフォントフォールバックの実装

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

Android 12 には 3 つのプロセス インタラクションがあります。 FontManagerServiceFont Updater 、およびApplication

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から削除したりしないでください。フォントをカスタマイズするには、次の 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を返します。

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

他のフォントを置換または変更するためのカスタマイズは、現地市場のニーズに合わせてtffファイルを変更する場合と同様です。実行時に 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アクセス許可を提供します。