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

Android 15 以降では、可変フォントは より効率的に、粒度を細かく調整できます。今回の更新により、ベンダーは 新しい可変フォント設定を追加して font_fallback.xml fonts.xml が非推奨になるため、fonts.xml の代わりに使用できるようになりました。 詳しくは、可変フォントのサポートをご覧ください。

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

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

FontManagerService は、システム サーバー内の集中管理システムです。FontManagerService には、ユーザーごとの最新のシステム フォント設定が格納されます。

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

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

可変フォントのサポート

Android 15 以降、可変フォント構成は 指定 font_fallback.xml 次の形式を使用します。

<family lang="und-Ethi" supportedAxes="wght,ital">
    <font>NotoSansEthiopic-VF.ttf</font>
</family>

この形式では、可変フォントには静的フォントのすべての属性が含まれ、 追加の supportedAxes 属性。supportedAxes 属性は、 サポートされている軸タグのカンマ区切りのリスト。あり Android 15 では、wght 軸と ital 軸のみを指定できます。 あります。

supportedAxes 属性が指定されていない場合、font ノードは axis で指定された可変フォントの単一インスタンスの静的フォント 子

supportedAxes 属性を指定すると、システムによって動的に 実行時に指定された太さとスタイル値に対応するフォント インスタンスです。

デベロッパーは android.graphics.fonts.SystemFonts#getAvailableFonts を使用できます。 Java API または ASystemFontIterator_open システムにインストールされているフォント ファイルのリストを取得するための NDK API。詳細については、 については、以下をご覧ください。 OpenType Variable Font API の改善 および buildVariableFamily

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

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

Google がフォント ファイル(特に NotoColorEmoji ファイル)を GMS で更新する そのため、NotoColorEmoji.ttf ファイルは、変更または削除しないでください。 /system パーティションから削除し、パーティションから /frameworks/base/data/fonts/fonts.xml。 フォントをカスタマイズする方法は 3 つあります。

  1. NotoColorEmoji.ttf ファイルを OEM ブランドの絵文字フォントに置き換える。
  2. 地域のニーズに応じて NotoColorEmoji.ttf ファイルを変更する。
  3. 他のフォント ファイルを置換または変更する。

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

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

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

  1. 独自のフォント(OEMCustomEmoji.ttf)を /system パーティションに配置します。
  2. /frameworks/base/data/fonts/fonts.xml(および /frameworks/base/data/fonts/font-fallback.xml インチ Android 15 以降)を次のコードに置き換えます。

    <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. 別の名前(Modified\_NotoColorEmoji.ttf など)で独自の NotoColorEmoji ファイルを作成します。
  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 で元のフォントから変更されたフォント ファイルが含まれます。

フォントの更新は Google により GMS Core で行われますが、一般的なフォントの更新メカニズムはすべての OEM が利用できます。OEM は、前提条件を満たすフォント ファイルに署名するランタイムでフォントを更新するの手順に沿って、追加のフォント アップデータをインストールできます。

前提条件を満たす

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

フォント ファイルに署名する

フォント ファイルはリスクのあるリソースであるため、信頼されたキーで検証する必要があります。更新するすべてのフォント ファイルを慎重に確認し、秘密鍵で署名します。署名は fs-verity と互換性がある必要があります。

ランタイムでフォントを更新する

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

アプリの更新機能に UPDATE_FONT signature|privileged 権限を付与します。