Android 11 以前では、デバイスにインストールされた AOSP ( /system/fonts
パーティション内) またはベンダー パーティション ( /product/fonts
または/system/fonts
パーティション内) のフォント ファイルを更新するには、OEM からのシステム アップデートが必要です。この要件は、絵文字の互換性に大きな影響を与えます。 Android 12 では、 FontManager
システム サービスを使用して、インストールされているフォント ファイルを管理し、システム アップデートなしでデバイスにインストールされているフォント ファイルを更新できます。
Android 12 には 3 つのプロセス インタラクションがあります。 FontManagerService
、 Font Updater
、およびApplication
。
FontManagerService
は、システム サーバーの中央管理システムです。 FontManagerService
は、ユーザーごとの最新のシステム フォント設定を格納します。
FontUpdater
は、 signature|privileged
パーミッション チェックによって信頼されているプラグイン可能なフォント アップデーターです。 FontUpdater
はFontManagerService
と通信して、現在のシステム フォント設定を取得、インストール、削除、または更新します。 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 つの方法に注意してください。
-
NotoColorEmoji.ttf
ファイルを OEM ブランドの絵文字フォントに置き換えます。 - ローカル市場のニーズに合わせて
NotoColorEmoji.ttf
ファイルを変更します。 - 他のフォント ファイルを置換または変更します。
AOSP で絵文字フォントを変更していない場合は、何もする必要はありません。絵文字フォントをカスタマイズする場合は、次のセクションの手順を使用してください。
NotoColorEmoji.ttf を OEM ブランドの絵文字フォントに置き換える
NotoColorEmoji.ttf
ファイルを OEM ブランドの絵文字フォント ファイルに置き換えるには、絵文字フォントをフォント フォールバック チェーンの直前に置きます。
-
OEMCustomEmoji.ttf
という独自のフォントを/system
パーティションに配置します。 /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 を変更する
次の手順に従って、ローカル市場のニーズに合わせてカスタマイズします。
- 別の名前で独自の
NotoColorEmoji
ファイルを作成します。たとえば、Modified\_NotoColorEmoji.ttf
という名前を付けます。 - 元の
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
アクセス許可を提供します。