Android 11 より前のバージョンでは、AOSP(/system/fonts
パーティション内)またはベンダー パーティション(/product/fonts
パーティションまたは /system/fonts
パーティション内)でデバイスにインストールされているフォント ファイルを更新するには、OEM によるシステム アップデートが必要でした。この要件は絵文字の互換性に大きな影響を与えます。Android 12 では、FontManager
システム サービスを使用することで、インストール済みのフォント ファイルを管理し、システム アップデートを行わずにデバイスにインストールされているフォント ファイルを更新できます。
Android 12 には、FontManagerService
、Font Updater
、Application
の 3 つのプロセス インタラクションがあります。
FontManagerService
は、システム サーバー内の集中管理システムです。FontManagerService
には、ユーザーごとの最新のシステム フォント設定が格納されます。
FontUpdater
は、signature|privileged
権限チェックによって信頼される、プラグイン可能なフォント アップデータです。FontUpdater
は FontManagerService
と通信して、現在のシステム フォント設定を取得、インストール、削除、更新します。FontUpdater
は、プロセス間通信(IPC)メカニズムを使用して新しいフォント ファイルのコンテンツを渡すことができます。FontManagerService
は、/data/fonts
ファイルなど、誰でも読み取れるストレージにコンテンツを保存します。このストレージは保護されます。SELinux ポリシーの制約により、FontManagerService
のみがこのストレージに書き込みを行えます。
Application
クラスは、起動時にシステム フォント設定を bindApplication
メソッドの引数として渡します。その後、フォント設定を初期化し、アプリプロセスで使用できるようにします。
カスタム フォントを実装する
一部の OEM は、自社のブランドを表現するために AOSP でフォント ファイルをインストールまたは置換します。Android 12 はこの機能をサポートしていますが、デバイスで絵文字フォントを更新するための要件が追加されています。絵文字フォント ファイルの変更や更新を行わない OEM の場合、この機能を使用する必要はありません。
フォント ファイル、特に NotoColorEmoji
ファイルの更新は GMS Core を介して Google が行います。/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 を変更する
次の手順に沿って、地域市場のニーズに合わせてカスタマイズします。
- 別の名前(
Modified\_NotoColorEmoji.ttf
など)で独自のNotoColorEmoji
ファイルを作成します。 - 元の
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 で元のフォントから変更されたフォント ファイルが含まれます。
フォントの更新は Google により GMS Core で行われますが、一般的なフォントの更新メカニズムはすべての OEM が利用できます。OEM は、前提条件を満たす、フォント ファイルに署名する、ランタイムでフォントを更新するの手順に沿って、追加のフォント アップデータをインストールできます。
前提条件を満たす
フォントの更新メカニズムでは、fs-verity
Linux カーネル機能を使用します。デバイスが fs-verity
に準拠していることを確認し、デバイスに証明書を含めます。
フォント ファイルに署名する
フォント ファイルはリスクのあるリソースであるため、信頼されたキーで検証する必要があります。更新するすべてのフォント ファイルを慎重に確認し、秘密鍵で署名します。署名は fs-verity
と互換性がある必要があります。
ランタイムでフォントを更新する
FontManger
システムアプリがフォントの更新を行います。FontManager
アプリは、インストールされた最新のシステムのフォント ステータスを提供し、署名付きでフォント ファイルを更新できます。更新アプリを呼び出すには、アプリの許可リストとマニフェストに UPDATE_FONT signature|privileged
権限を追加します。
アプリの更新機能に UPDATE_FONT signature|privileged
権限を付与します。