FCM ライフサイクル

Android フレームワーク リリースには、複数のフレームワーク互換性マトリックス(FCM)が含まれます。これらの複数のマトリックスはそれぞれ、アップグレード可能な各ターゲット FCM バージョンに対応しており、フレームワークで何が使用されるかと、ターゲット FCM バージョンの要件を定義します。FCM ライフサイクルの一環として、Android は HIDL HAL のサポートを終了して削除し、HAL バージョンのステータスを反映するために FCM ファイルを変更します。

フレームワークのみの OTA を OTA 固有のエコシステムで有効にするためには、ベンダー インターフェースを拡張するパートナーも、同様の方法で HIDL HAL のサポートを終了して削除する必要があります。

用語

フレームワーク互換性マトリックス(FCM)
ベンダー実装の準拠に関するフレームワーク要件を指定する XML ファイル。互換性マトリックスはバージョニングされ、フレームワーク リリースごとに新しいバージョンが凍結されます。各フレームワーク リリースには複数の FCM が含まれます。
プラットフォーム FCM バージョン(SF
フレームワーク リリースに含まれるすべての FCM バージョンのセット。フレームワークは、これらの FCM のいずれか 1 つの要件を満たすベンダー実装と連携して動作します。
FCM バージョン(F)
フレームワーク リリースに含まれるすべての FCM の中で最も上位のバージョン。
ターゲット FCM バージョン(V)
ベンダー実装が要件を満たす、ターゲットとなる FCM バージョン(SF 内のセットのいずれか)。デバイス マニフェストで明示的に宣言されます。ベンダー実装は公開された FCM に対して生成する必要がありますが、デバイス マニフェストで新しい HAL バージョンを宣言することもできます。
HAL バージョン
HAL バージョンの形式は foo@x.yfoo は HAL 名、x.y は特定のバージョン)です。例: nfc@1.0keymaster@3.0(このドキュメントでは、android.hardware のようなルート プレフィックスの表記は省略します)。
デバイス マニフェスト
ベンダー インターフェースのデバイス側の HAL バージョン(ベンダー イメージや ODM イメージなど)を指定する XML ファイル。デバイス マニフェストの内容はデバイスのターゲット FCM バージョンによって制約を受けますが、V に対応する FCM よりも厳密に新しい HAL をリストできます。
デバイス HAL
デバイス マニフェストにリスト(指定)され、フレームワーク互換性マトリックス(FCM)にリストされる HAL。
デバイス互換性マトリックス(DCM)
フレームワークの準拠に関するベンダー要件を指定する XML ファイル。各デバイスには 1 つの DCM が含まれています。
フレームワーク マニフェスト
system、system_ext、product イメージなど、ベンダー インターフェースのフレームワーク側が提供する HAL バージョンを指定する XML ファイル。フレームワーク マニフェストの HAL は、デバイスのターゲット FCM バージョンに応じて動的に無効になります。
フレームワーク HAL
フレームワーク マニフェストで提供され、デバイス互換性マトリックス(DCM)にリストされている HAL。

コードベースの FCM ライフサイクル

このドキュメントでは、FCM ライフサイクルの概念を説明します。サポートされているマニフェストについては、hardware/interfaces/compatibility_matrix.<FCM>.xml を参照してください。FCM の情報は system/libvintf/include/vintf/Level.h にあります。

対応する Android リリース バージョンで出荷されるデバイスは、対応する FCM 値がそのバージョンのレベル以上であることが期待されます。たとえば、Android 11 で出荷されるデバイスは通常 FCM レベル 5 ですが、FCM レベル 6 以上を実装します。この場合、互換性マトリックスで指定されたさまざまな追加要件が適用されます。サポートされているレベルは次のとおりです。

FCM Android バージョン
4 Android 10/Q
5 Android 11/R
6 Android 12/S
7 Android 13/T
8 Android 14/U
202404 Android 15/V

FCM レベルはベンダー API レベルと同等かそれより新しいです。

Android が FCM レベルのサポートを終了した場合でも、既存のデバイスではサポートが継続されます。低い FCM レベルをターゲットとするデバイスは、新しい FCM レベルにリストされている HAL の使用が暗黙的に許容されます。ただし、その HAL がブランチで使用可能であることが条件です。

新しい FCM バージョンで開発する

Android は、フレームワーク リリースのたびに FCM バージョンをインクリメントします(Android 8、8.1 など)。開発中は、新しい compatibility_matrix.F.xml が作成され、既存の compatibility_matrix.f.xmlf < F)は変更されません。

新しい FCM バージョン F で開発を開始するには:

  1. 最新の compatibility_matrix.<F-1>.xmlcompatibility_matrix.F.xml にコピーします。
  2. ファイル内の level 属性を F に更新します。
  3. 対応するビルドルールを追加して、この互換性マトリックスをデバイスにインストールします。

新しい HAL を導入する

開発中に、現在の FCM バージョン F で新しい HAL(Wi-Fi、NFC など)を Android に導入する場合、compatibility_matrix.F.xml に HAL を追加します。

たとえば、Android 8.1 は cas@1.0 を導入しました。Android 8.1 でリリースするデバイスはこの HAL を実装でき、compatibility_matrix.F.xml(該当リリースの開発中、一時的に compatibility_matrix.current.xml という名前でした)に次のエントリが追加されました。

<hal format="hidl">
    <name>android.hardware.cas</name>
    <version>1.0</version>
    <interface>
        <name>IMediaCasService</name>
        <instance>default</instance>
    </interface>
</hal>

HAL を(マイナー)アップグレードする

AIDL HAL バージョンはマイナー HAL バージョンとしてカウントされます。HIDL インターフェース バージョンには 1.2 のような major.minor バージョンがあります。

開発中に、現在の FCM バージョン F で AIDL HAL が 2 から 3 へアップデートするときは、新しいバージョンが compatibility_matrix.F.xml の HAL エントリに追加されます。HAL エントリのバージョン フィールドには、2-3 のような範囲が指定できます。

たとえば、Android FCM F では HAL のマイナー バージョン アップグレードとして foo@3 が導入されました。古い FCM をターゲットとするデバイスでは古いバージョン foo@2 が使用されますが、Android FCM F をターゲットとするデバイスでは新しいバージョン foo@3 が使用されます。バージョン 2 前の古い FCM のエントリは次のとおりです。

<hal format="aidl">
    <name>foo</name>
    <version>2</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

このエントリは compatibility_matrix.F.xml にコピーされ、バージョン 3 をサポートするため次のように変更されました。

<hal format="aidl">
    <name>foo</name>
    <version>2-3</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

HAL を(メジャー)アップグレードする

開発中に、現在の FCM バージョン F で HAL のバージョンをメジャー アップグレードするときは、次のように設定された compatibility_matrix.F.xml に新しいメジャー バージョン x.0 が追加されます。

  • 出荷時設定が V = F であるデバイスを x.0 でリリースする必要がある場合は、バージョン x.0 のみ。
  • 出荷時設定が V = F であるデバイスを、古いメジャー バージョンでリリースできる場合は、<hal> タグに古いメジャー バージョンを指定。

たとえば、FCM バージョン F では、1.0 HAL のメジャー バージョン アップグレードとして foo@2.0 が導入され、1.0 HAL のサポートが終了しました。古いバージョン foo@1.0 は、以前の FCM バージョンをターゲットとするデバイスで使われます。FCM バージョン F をターゲットとするデバイスで HAL を提供するときは、新しい 2.0 バージョンを提供する必要があります。この例では、以前の FCM バージョンにこのエントリが含まれています。

<hal format="hidl">
    <name>foo</name>
    <version>1.0</version>;
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

このエントリを compatibility_matrix.F.xml にコピーして、次のように変更します。

<hal format="hidl">
    <name>foo</name>
    <version>2.0</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

制限事項:

  • 1.0 HAL は compatibility_matrix.F.xml に含まれないため、FCM バージョン F をターゲットとするデバイスは 1.0 HAL を提供できません(この HAL はサポートが終了したと見なされます)。
  • 古い FCM バージョンには 1.0 HAL が存在するため、フレームワークは引き続き 1.0 HAL と連携して動作でき、古い FCM バージョンをターゲットとする古いデバイスとも下位互換性を保っています。

新しい FCM バージョン

システム パーティションにおける FCM バージョンのリリースは、AOSP リリースの一環として Google のみが実施します。このプロセスには次のステップがあります。

  1. compatibility_matrix.F.xml の属性が level="F" であることを確認します。
  2. すべてのデバイスのビルドとリリースを確認します。
  3. VTS テストを更新し、最新のフレームワーク(Shipping API レベルに基づく)でリリースするデバイスのターゲット FCM バージョンが V >= F であることを確認します。
  4. AOSP にファイルを公開します。

たとえば、VTS テストで、Android 9 でリリースするデバイスのターゲット FCM バージョンが 3 以上であることが確認されています。

また、product と system_ext の FCM では、プラットフォーム FCM バージョンごとに要件をリストすることもできます。product パーティションと system_ext パーティションにおける FCM バージョンのリリースは、それぞれイメージのオーナーによって行われます。product パーティションと system_ext パーティションの FCM バージョン番号は、システム パーティションの FCM バージョン番号と一致している必要があります。システム パーティションの FCM バージョンと同様に、product パーティションと system_ext パーティションの FCM バージョン F での互換性マトリックスは、ターゲット FCM バージョン F のデバイスの要件を反映しています。

HAL バージョンのサポート終了

HAL バージョンのサポート終了はデベロッパーが決定します(たとえば、AOSP HAL の場合は Google が決定します)。サポート終了は、上位の HAL バージョン(マイナーかメジャーかを問わない)がリリースされたときに実施される可能性があります。

デバイス HAL のサポート終了

FCM バージョン F で特定のデバイスの HAL foo@x.y のサポートが終了したということは、ターゲット FCM バージョン V = F 以降でリリースするデバイスでは、バージョン x.yx.y より前のバージョンで foo を実装できないことを意味します。サポートが終了した HAL バージョンは、デバイスをアップグレードするフレームワークでは引き続きサポートされます。

FCM バージョン F がリリースされたとき、ターゲット FCM バージョン V = F の最新の FCM に特定の HAL バージョンが明示的に記述されていないと、HAL バージョン foo@x.y はサポートが終了したと見なされます。V = F でリリースするデバイスの場合、次のいずれかの状態に該当します。

  • フレームワークは、より上位のバージョン(メジャーかマイナーかを問わない)を必要とする。
  • フレームワークは、これ以上 HAL を必要としない。

たとえば、Android 9 では、1.0 HAL のメジャー バージョン アップグレードとして health@2.0 が導入されました。health@1.0compatibility_matrix.3.xml からは削除されましたが、compatibility_matrix.legacy.xmlcompatibility_matrix.1.xmlcompatibility_matrix.2.xml にはあります。したがって、health@1.0 はサポートが終了したと見なされます。

フレームワーク HAL のサポート終了

FCM バージョン F で特定のフレームワーク HAL foo@x.y のサポートが終了したということは、ターゲット FCM バージョン V = F 以降でリリースするデバイスでは、そのフレームワークがバージョン x.yx.y より前のバージョンで foo を指定することはできません。サポートが終了した HAL バージョンは、デバイスをアップグレードするフレームワークでは引き続き指定されます。

FCM バージョン F がリリースされたとき、フレームワーク マニフェストで foo@x.ymax-level="F - 1" が指定されている場合、HAL バージョン foo@x.y はサポートが終了したと見なされます。V = F でリリースされるデバイスの場合、フレームワークは HAL foo@x.y を指定しません。V = F でリリースされるデバイス上のデバイス互換性マトリックスで、max-level < V を含むフレームワーク HAL をリストすることはできません。

たとえば、Android 12 では schedulerservice@1.0 のサポートが終了しました。その max-level 属性は、5(Android 11 で導入された FCM バージョン)に設定されています。Android 12 フレームワーク マニフェストをご覧ください。

ターゲット FCM バージョンのサポートの削除

ターゲット FCM バージョン V のアクティブなデバイスの数が特定のしきい値を下回ると、そのターゲット FCM バージョンは次回のフレームワーク リリースのセット SF から削除されます。これは、次の両方のステップによって行われます。

  1. システム イメージにインストールされないように、ビルドルールから compatibility_matrix.V.xml を削除し、削除された機能を実装するコードまたはその機能が依存するコードを削除します。

  2. max-levelV 以下のフレームワーク HAL をフレームワーク マニフェストから削除し、削除されたフレームワーク HAL を実装するコードをすべて削除します。

特定のフレームワーク リリースで SF に存在しないターゲット FCM バージョンを持つデバイスを、そのリリースにアップグレードすることはできません。

HAL バージョンのステータス

以下のセクションでは、HAL バージョンが取りうるステータスを(時系列順に)説明します。

未リリース時

デバイス HAL では、HAL バージョンが公開済みの互換性マトリックスおよび凍結された互換性マトリックスに含まれていない場合は、未リリースと見なされ、開発中であると考えられます。これには、compatibility_matrix.F.xml にのみ含まれる HAL バージョンが含まれます。例:

  • Android 9 の開発中、health@2.0 HAL は未リリースの HAL と見なされ、compatibility_matrix.3.xml にのみ存在していました。
  • teleportation@1.0 HAL はリリース済みの互換性マトリックスに含まれておらず、未リリースの HAL と見なされます。

フレームワーク HAL では、無関係な開発ブランチのフレームワーク マニフェストにのみ HAL バージョンが含まれている場合、そのバージョンは未リリースと見なされます。

リリース済み、現行バージョン

デバイス HAL では、HAL バージョンが公開済みの互換性マトリックスまたは凍結された互換性マトリックスに含まれている場合は、リリース済みと見なされます。たとえば、FCM バージョン 3 が凍結されて AOSP に公開された後、health@2.0 HAL はリリース済みの現行 HAL バージョンと見なされます。

HAL バージョンが、FCM バージョンが最も高い公開済みの互換性マトリックスまたは凍結された互換性マトリックスに含まれている場合、その HAL バージョンは現行バージョンと見なされます(つまり、サポートは終了していません)。たとえば、compatibility_matrix.3.xml に現在含まれている既存の HAL バージョン(compatibility_matrix.legacy.xml で導入された nfc@1.0 など)も、リリース済みの現行 HAL バージョンと見なされます。

フレームワーク HAL では、HAL バージョンが最新のリリース ブランチのフレームワーク マニフェストに含まれていて、max-level 属性がない、または(通常は)max-level 以上の FCM がある場合、このブランチでリリースされたバージョンはリリース済みの現在の HAL バージョンと見なされます。たとえば、Android 12 のフレームワーク マニフェストで指定されているように、Android 12 では displayservice HAL はリリース済みの現行バージョンです。

リリース済み、サポート終了

デバイス HAL では、HAL バージョンのサポートが終了するのは、次の条件をすべて満たす場合のみです。

  • リリース済みである。
  • FCM バージョンが最も高い公開済みの互換性マトリックスまたは凍結された互換性マトリックスに含まれていない。
  • フレームワークが現在もサポートしている公開済みの互換性マトリックスまたは凍結された互換性マトリックスに含まれている。

例:

したがって、Android 9 では、power@1.0 は現行バージョンであり、サポートは終了していません

フレームワーク HAL では、最新のリリース ブランチのフレームワーク マニフェストに、このブランチでリリースされた FCM バージョンよりも小さい max-level 属性を持つ HAL バージョンがある場合、リリースされたと見なされますが、HAL バージョンのサポートは終了しています。たとえば、Android 12 のフレームワーク マニフェストで指定されているように、Android 12 では schedulerservice HAL はリリース済みですがサポートを終了しています。

削除済み

デバイス HAL では、HAL バージョンが削除されるのは、次の条件をすべて満たす場合のみです。

  • 以前リリースされた。
  • フレームワークがサポートしている公開済みの互換性マトリックスまたは凍結された互換性マトリックスに含まれていない。

公開済みまたは凍結されているがフレームワークによりサポートされていない互換性マトリックスは、削除された HAL バージョンのセットを定義するコードベースに保持されます。これにより、削除された HAL バージョンが新しいデバイスに存在しないことを確認する VTS テストを作成できます。

フレームワーク HAL では、HAL バージョンが削除されるのは、次の条件をすべて満たす場合のみです。

  • 以前リリースされた。
  • リリースされた最新のブランチのフレームワーク マニフェストに含まれていない。

レガシー FCM

ターゲット FCM バージョンのレガシーは、Treble に対応していないすべてのデバイス用の特別な値です。レガシー FCM である compatibility_matrix.legacy.xml には、レガシー デバイス(Android 8.0 より前のバージョンでリリースするデバイス)のフレームワークの要件がリストされています。

バージョン F の FCM に対してこのファイルが存在する場合、デバイス マニフェストがこのファイルと互換性があれば、任意の非 Treble デバイスを F にアップグレードできます。削除の手続きは、他のターゲット FCM バージョンの FCM と同じです(8.0 より前のアクティブなデバイスの数が特定のしきい値を下回ると削除されます)。

リリース済みの FCM バージョン

リリース済みの FCM バージョンのリストは hardware/interfaces/compatibility_matrices で確認できます。

特定の Android リリースでリリースされた FCM バージョンを確認するには、Level.h をご覧ください。