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

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ファイルなどの誰でも読み取り可能な保存場所に保存します。このストレージは保護されています。これは、 FontManagerServiceによってのみ、SELinuxポリシーによって記述できます。

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

カスタムフォントの実装

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

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

  1. NotoColorEmoji.ttfファイルをOEMブランドの絵文字フォントに置き換えます。
  2. ローカル市場のニーズに合わせてNotoColorEmoji.ttfファイルを変更します。
  3. 他のフォントファイルを置き換えるか変更します。

AOSPで絵文字フォントを変更していない場合は、アクションを実行する必要はありません。絵文字フォントをカスタマイズする場合は、次のセクションの手順を使用してください。

NotoColorEmoji.ttfをOEMブランドの絵文字フォントに置き換える

NotoColorEmoji.ttfファイルをOEMブランドの絵文字フォントファイルに置き換えるには、フォントフォールバックチェーンの直前に絵文字フォントを配置します。

  1. /systemパーティションにOEMCustomEmoji.ttfという独自のフォントを配置します。
  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の元のフォントから変更されたフォントファイルが含まれます。

フォントの更新はGMSCoreでGoogleによって行われますが、一般的なフォントの更新メカニズムはすべてのOEMに公開されています。 OEMは、前提条件の満たし、フォントファイルへの署名、およびランタイムフォント更新の作成の手順を使用して、追加のフォントアップデータをインストールできます。

前提条件を満たしている

フォント更新メカニズムは、 fs-verityカーネル機能を使用します。デバイスがfs-verityに準拠していることを確認し、デバイスに証明書を含めます。

フォントファイルへの署名

フォントファイルは危険なリソースであるため、信頼できるキーで検証する必要があります。更新するすべてのフォントファイルを注意深く確認し、秘密鍵で署名します。署名はfs-verityと互換性がある必要があります。

ランタイムフォントの更新

FontMangerシステムアプリはフォントの更新を実行します。 FontManagerアプリは、最新のインストール済みシステムフォントステータスと、署名付きのフォントファイルを更新する機能を提供します。更新アプリを呼び出すには、 UPDATE_FONT signature|privileged権限をアプリの許可リストとマニフェストに追加します

アプリのアップデーター関数にUPDATE_FONT signature|privilegedを付与します。