AOSP 共通カーネル(Android 共通カーネルまたはACKとも呼ばれる) は、 kernel.orgカーネルのダウンストリームであり、メインラインまたは長期サポート (LTS) カーネルにマージされていない Android コミュニティにとって興味深いパッチが含まれています。これらのパッチには次のものが含まれます。
- Android 機能に必要なアップストリーム機能のバックポートと厳選機能
- Android デバイス向けに準備が整っている機能ですが、上流でまだ開発中です (たとえば、Energy Aware Scheduler タスク配置の最適化)。
- 他のエコシステム パートナーにとって役立つベンダー/OEM 機能 (sdcardfs など)。
android-mainline
、Android 機能の主要な開発ブランチです。 Linus Torvalds がリリースまたはリリース候補を投稿するたびに、Linux メインラインはandroid-mainline
にマージされます。 2019 年以前は、Android 共通カーネルは、最近宣言された LTS カーネルのクローンを作成し、Android 固有のパッチを追加することによって構築されていました。このプロセスは 2019 年に変更され、新しい Android 共通カーネルをandroid-mainline
から分岐させました。この新しいモデルでは、同じ結果を段階的に達成することで、ポートを転送して Android パッチをテストするという多大な労力を回避します。 android-mainline
重要な継続的テストを受けており、このモデルは公開された日から高品質のカーネルを保証します。
新しい LTS が上流で宣言されると、対応する共通カーネルがandroid-mainline
から分岐されます。これにより、パートナーはandroid-mainline
からマージすることで、LTS バージョンの宣言前にプロジェクトを開始できます。新しい共通カーネル ブランチが作成された後、パートナーはマージ ソースを新しいブランチにシームレスに変更できます。
他の一般的なカーネル ブランチは、関連するLTS カーネルから定期的なマージを受け取ります。これらのマージは通常、LTS リリースが公開された直後に行われます。たとえば、Linux 4.19.64 が公開されたとき、それは 4.19 共通カーネル (たとえば、 android-4.19-q
) にマージされました。パートナーには、共通カーネルから製品カーネルに定期的にマージして、LTS および Android 固有のバグ修正を最新の状態に保つことを強くお勧めします。
ACK KMI カーネル ブランチ
GKI カーネルには安定したカーネル モジュール インターフェイスがあります。 KMI はカーネル バージョンと Android プラットフォーム リリースによって一意に識別されるため、ブランチには<androidRelease>-<kernel version>
という名前が付けられます。たとえば、Android 11 の 5.4 GKI カーネルの名前はandroid11-5.4.
Android 12 の場合、 android12-5.4
とandroid12-5.10
という 2 つの追加の GKI カーネルがあります。
レガシーデザートカーネルブランチ
レガシー デザート カーネルは、新機能の開発が Android 共通カーネルからのマージを妨げないことを保証するために作成されました。これらのブランチは、関連するデザートのリリース前に作成され、LTS から定期的にマージを受けますが、新機能はありません。たとえば、 android-4.9-q
LTS 4.9.y ブランチからマージを受け取ります。
カーネル バージョンが起動カーネルではない場合、デザート カーネルは作成されませんが、最新のプラットフォーム リリースに関連付けられたカーネルは、将来の Android プラットフォーム リリースへのアップグレードに有効です。たとえば、 android-4.9-q
android-4.9*
デザート ブランチの最後のものであるため、元のプラットフォーム リリースである Android 10 でサポートおよびテストされています。また、4.9 を実行しているデバイスのアップグレードをサポートするプラットフォーム リリースでもサポートおよびテストされています。カーネル: Android 11 および Android 12。
Android プラットフォーム リリースのデザート命名スキームは Android 10 で削除されたため、 android-4.14-r
およびandroid-4.19-r
と呼ばれる最後のデザート リリースは、代わりにandroid-4.14-stable
およびandroid-4.19-stable
呼ばれるようになりました。
Android 11 以降、デザート カーネルは GKI カーネルに置き換えられるため、サポートされるデザート カーネルの完全なリストがこの表に示されています。
Android プラットフォームのリリース | カーネル | までサポートされます |
---|---|---|
アンドロイド10 | android-4.9-q android-4.14-q android-4.19-q | 2023年1月 |
アンドロイド11 | android-4.14-stable android-4.19-stable | 2024年1月 2024年12月 |
レガシーリリースのカーネルブランチ
リリース カーネルは、月例のAndroid セキュリティ情報に記載されているパッチのバックポートを提供するために維持されています。これらは、新しい Android プラットフォームのリリース時に、起動カーネルごとに作成されました。これらは、 「サポート期間とセキュリティ パッチ」で説明されているように、関連するカーネルまたはプラットフォームのリリースが非推奨になると非推奨になります。
Android セキュリティ速報が毎月発行されると、これらのカーネルは、アップストリーム カーネルおよび Android 共通カーネルに関連する、速報で引用されているパッチのバックポートで更新されます。 LTS パッチは受け取らないため、マイナー バージョン番号は決して変更されません。これらには、ベンダー固有のパッチのバックポートは含まれていません。
Android 11 以降のプラットフォーム リリースでは、パートナーはデザート カーネルまたは GKI カーネルからマージして、Android セキュリティ情報に記載されているパッチを適用する必要があります。 Android 11 以降のプラットフォーム リリース用のリリース カーネルは作成されません。
したがって、14 のリリース カーネルの完全なリストがこの表に示されており、何も追加されません。
Android プラットフォームのリリース | カーネル | までサポートされます |
---|---|---|
アンドロイド10 | android-4.9-q-release android-4.14-q-release android-4.19-q-release | 2023年1月 |
カーネルの機能と起動
Android プラットフォームの各リリースは、3 つの Linux カーネル バージョンのいずれかに基づく新しいデバイスの起動をサポートしています。以下の表に示すように、Android 11 の起動カーネルはandroid-4.14-stable
、 android-4.19-stable
、およびandroid11-5.4
です。
通常、プラットフォーム リリースの更新時にカーネルのアップグレードは必要ないため、プラットフォーム リリースの最新機能が欠けているカーネルをデバイスの起動に使用できます。したがって、 Android 10 用に設計されたカーネル ( android-4.19-q
など) は、プラットフォーム リリースを Android 11 にアップグレードした後でもデバイスで使用できます。 Android 12 以降では、機能カーネルの数が起動カーネルよりも少なくなり、カーネルの数が制限されます。サポートする必要がある安定した KMI。
Android プラットフォームのリリース | カーネルを起動する | 機能カーネル |
---|---|---|
アンドロイド 14 (2023) | android14-6.1 android14-5.15 android13-5.15 android13-5.10 android12-5.10 1 | android14-6.1 android14-5.15 |
アンドロイド 13 (2022) | android13-5.15 android13-5.10 android12-5.10 1 android12-5.4 1 android11-5.4 1 | android13-5.15 android13-5.10 |
Android 12 (2021) | android12-5.10 android12-5.4 android11-5.4 1 android-4.19-stable | android12-5.10 android12-5.4 |
Android 11 (2020) | android11-5.4 android-4.19-stable android-4.14-stable | android11-5.4 android-4.19-stable android-4.14-stable |
Android 10 (2019) | android-4.19-q android-4.14-q android-4.9-q | android-4.19-q android-4.14-q android-4.9-q |
1関連する BSP がプラットフォーム リリース用に更新されている場合、追加の制限が適用される場合があります。より一般的に言えば、カーネルのAndroid リリース番号はターゲット FCM バージョン以上である必要があります。詳細については、「ベンダー インターフェイス オブジェクト - カーネル ブランチの一致」を参照してください。 |
共通のカーネル階層
android-mainline からの分岐
共通カーネル階層の最上位を図 1 に示します。
図 1. android-mainline カーネルからの共通カーネルの作成
新しい Android 共通カーネルandroid12-5.10
2020 年にandroid-mainline
から分岐したことに注意してください。2021 年に次の LTS が宣言されたとき、 android13-5.15
android-mainline
から分岐しました。
図 1 に示すように、各カーネル バージョンは 2 つの GKI カーネルの基礎となります。たとえば、2 つの v5.4 カーネルはandroid11-5.4
とandroid12-5.4
で、どちらもそれぞれのプラットフォーム リリースの機能カーネルです。これは 5.10 にも当てはまります。 android12-5.10
は LTS が宣言されたときに作成され、 android13-5.10
2021 年春のカーネル機能完了マイルストーンでandroid12-5.10
から分岐し、Android 13 の機能の開発が可能になります。
ACK KMI ブランチのライフサイクル
ACK KMI ブランチのライフサイクルを以下の図 2 に示します。
図2.5.10 ACK KMI ブランチのライフサイクル
開発プロセスとブランチのライフサイクルを明確にするために、図 2 は 5.10 の ACK KMI ブランチに焦点を当てています。
各 ACK KMI ブランチは、図 2 に各ブランチで異なる色で示されている 3 つのフェーズを循環します。このように、LTS はフェーズに関係なく定期的にマージされます。
開発段階
ACK KMI ブランチが作成されると、開発フェーズ(図 2 のdev ) に入り、次の Android プラットフォーム リリースに向けた機能の提供が可能になります。図 2 では、5.10 が新しいアップストリーム LTS カーネルとして宣言されたときに、 android12-5.10
が作成されました。カーネル バージョンの 2 番目の ACK KMI ブランチは、後続のリリースの開発を可能にするために、以前に作成される場合があります。図 2 では、 android13-5.10
が開発フェーズから移行すると、 android12-5.10
が作成されます。
安定化段階
ACK KMI ブランチは、機能の完了が宣言されると、図 2 で「スタブ」と表示されている安定化フェーズに入ります。パートナー機能とバグ修正は引き続き受け入れられますが、インターフェイスに影響を与える変更を検出するために KMI 追跡が有効になります。このフェーズでは、KMI を破壊する変更は受け入れられますが、必要に応じて KMI 定義を更新する必要があります。 KMI モニタリングの詳細については、 「GKI の概要」を参照してください。
KMI凍結相
新しいプラットフォーム リリースが AOSP にプッシュされる前に、ACK KMI ブランチはフリーズされ、ブランチの存続期間中フリーズされたままになります。これは、安定した KMI に影響を与えずに軽減できない重大なセキュリティ問題が特定されない限り、KMI を破壊する変更は受け入れられないことを意味します。 KMI の破損を回避するために、Android デバイスに修正が必要ない場合、LTS からマージされた一部のパッチが変更または削除される可能性があります。
ACK KMI ブランチが凍結されている場合、既存の KMI 共通カーネルが壊れていない限り、バグ修正とパートナー機能を受け入れることができます。現在の KMI を構成するインターフェイスが影響を受けない限り、新しいエクスポートされたシンボルを使用して KMI を拡張できます。新しいインターフェイスが KMI に追加されると、それらはすぐに安定し、将来の変更によって壊れることはありません。
たとえば、KMI インターフェイスの共通カーネルで使用される構造にフィールドを追加する変更は、インターフェイス定義が変更されるため許可されません。
struct foo {
int original_field1;
int original_field2;
int new_field; // Not allowed
};
int do_foo(struct foo &myarg)
{
do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);
ただし、新しい関数を追加することは問題ありません。
struct foo2 {
struct foo orig_foo;
int new_field;
};
int do_foo2(struct foo2 &myarg)
{
do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);
GKI カーネルの存続期間中は、デバイスが起動された Android プラットフォーム リリースでカーネルを安全に使用できるように、ユーザー空間との下位互換性が維持されます。以前のリリースとの継続的なテストにより、互換性が維持されることが保証されます。したがって、図 2 では、 android12-5.10
カーネルは Android 12 デバイスと Android 13 デバイスで使用できます。 Android プラットフォーム リリースは以前のバージョンとも互換性があるため、 android12-5.4
カーネルは Android 13 デバイスの起動またはアップグレードに使用できます。
凍結フェーズに入ると、ブランチには KMI 世代番号を含む KMI バージョン文字列で git タグが付けられます。たとえば、 android11-5.4
がフリーズされた場合、KMI バージョン文字列5.4-android11-0
のタグが付けられました。末尾の0
は KMI 世代番号です。セキュリティ上の問題や、KMI を変更するパッチの受け入れを必要とするその他のイベントが発生した場合、KMI 生成番号がインクリメントされ、ブランチに再タグ付けされます。たとえば、そのような変更がandroid11-5.4
に受け入れられた場合、ブランチには新しい KMI バージョン5.4-android11-1
がタグ付けされます。現在の KMI 世代は、 uname
コマンドを使用して確認できます。
$ uname -r
5.4.61-android11-0-00153-ga972f59040e4
プラットフォーム リリース後の番号は KMI 世代 (この場合は 0) です。
KMI の世代が変わると、カーネルは前の KMI 世代に準拠するベンダー モジュールと互換性がなくなるため、モジュールはカーネルと同期して再構築および更新する必要があります。 KMI の世代交代は非常にまれであると予想されます。
カーネル間の互換性
同じ LTS ファミリ内のカーネル間の互換性要件は、新しい GKI カーネルから変更されています。
GKI カーネル
GKI カーネルは、そのカーネル バージョンをサポートするすべての Android プラットフォーム リリースとの下位互換性を維持します。さらに、Android プラットフォームのリリースには、以前のリリースの GKI カーネルとの下位互換性があります。そのため、Android 12 用に開発されたandroid12-5.4
カーネルを、Android 13 を実行しているデバイスで安全に使用できます。互換性は、サポートされているすべてのリリースでの GKI カーネルの継続的な VTS および CTS テストを通じて検証されます。
KMI は安定しているため、ベンダー イメージ内のカーネル モジュールを再構築しなくてもカーネルを更新できます。
KMI 互換性は、異なる GKI カーネル間では維持されません。したがって、たとえば、すべてのモジュールをリビルドしない限り、 android12-5.10
カーネルをandroid13-5.10
カーネルに置き換えることはできません。
GKI カーネルは、初期リリースと後続のリリースでのみサポートされます。古いリリースではサポートされていません。したがって、 android13-5.10
カーネルは Android 12 デバイスではサポートされません。
レガシーカーネル
従来のデザート カーネル ( *-q
および*-stable
) は、Android プラットフォーム リリース間で下位互換性がありませんが、以前の 2 つの Android プラットフォーム リリースのカーネルはアップグレードがサポートされています。したがって、 android-4.19-q
ベースのカーネルを使用して Android 10 で起動されたデバイスは、Android 2020 にアップグレードするときにandroid-4.19-q
カーネルを引き続き使用するか、ベンダー固有のコードを更新してandroid-4.19-stable
をサポートすることができます。 。
互換性マトリックス
この表は、各 Android プラットフォーム リリースでサポートおよびテストされているカーネル バージョンを示しています。
Android プラットフォームのリリース | アップグレードがサポートされているカーネル | 起動用にサポートされているカーネル |
---|---|---|
アンドロイド 14 (2023) | android14-6.1 | android14-6.1 |
アンドロイド 13 (2022) | android13-5.15 | android13-5.15 |
Android 12 (2021) | android12-5.10 | android-4.19-stable |
Android 11 (2020) | android11-5.4 | android11-5.4 |
Android 10 (2019) | android-4.14-stable | android-4.14-stable |
サポート期間とセキュリティ パッチ
Android 共通カーネルは、関連する LTS カーネルまたは Android プラットフォーム リリースがサポートされなくなるまでサポートされます。カーネルはサポートされていますが、アップストリームからの LTS マージと Android 固有のコードのバグ修正を引き続き受け取ります。これらの修正には、Android 共通カーネルに関連する月次Android セキュリティ速報に記載されているすべてのカーネル セキュリティ パッチが含まれます。
パートナーは、Android 共通カーネルから定期的にマージすることで、可能な限りすべてのカーネル セキュリティ パッチを取得できると確信できます。
一般的なカーネルテスト
共通カーネルは、ベンダーによるダウンストリーム テストに加えて、いくつかの CI システムでテストされます。
Linux カーネル機能テスト
Linux カーネル機能テスト (LKFT)テストは、一連の物理 arm32 および arm64 デバイス上で、kselftest、LTP、VTS、および CTS を含むさまざまなテスト スイートを開始します。最近のテスト結果はここでご覧いただけます。
カーネルCIテスト
新しいパッチが共通のカーネル ブランチにコミットされるたびに、 KernelCI のビルドおよびブート テストが開始されます。数百のビルド構成がテストされ、さまざまなボードで起動されます。 Android カーネルの最近の結果は、ここでご覧いただけます。
Android の送信前および送信後のテスト
事前送信テストは、Android 共通カーネルに障害が持ち込まれるのを防ぐために使用されます。テスト結果の概要は、Android 共通カーネル gerrit のコード変更の「チェック」タブにあります。
Android の送信後テストは、新しいパッチがci.android.comの Android 共通カーネル ブランチにコミットされるときに、Android 共通カーネル ブランチ内の新しく公開されたビルドに対して実行されます。 ci.android.comでブランチ名の一部としてaosp_kernel
入力すると、カーネル ブランチのリストと利用可能な結果が表示されます。たとえば、 android-mainline
の結果はここにあります。特定のビルドをクリックすると、 Test Results
タブにテスト ステータスが表示されます。
Android プラットフォーム ソース ツリー内のテスト グループkernel-presubmit
を使用したtest-mappingによって定義されたテストは、Android カーネル ブランチの presubmit として実行されます。たとえば、test/vts/tests/kernel_proc_file_api_test/TEST_MAPPINGで次の設定を行うと、Android 共通カーネル コードのチェックイン時のプレスブミット テストとして vts_kernel_proc_file_api_test が有効になります。
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
ゼロデイテスト
ゼロデイテストでは、新しいパッチがコミットされたときに、すべての Android 共通カーネル ブランチに対してパッチごとのテストが実行されます。さまざまなブート、機能、パフォーマンスのテストが実行されます。公開グループcros-kernel-buildreportsに参加します
テストマトリックス
Android共通カーネル | Android プラットフォームのリリース | テストスイート | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
主要 | 14 | 13 | 12 | 11 | 10 | LKFT | カーネルCI | 事前送信 | 送信後 | ゼロデイ | |
android-mainline | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | android13-5.15 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Android 共通カーネルに貢献する
一般に、機能開発は Android 共通カーネルではなく、メインライン Linux で行う必要があります。アップストリーム開発が強く推奨されており、そこで開発が受け入れられた後は、必要に応じて特定の ACK ブランチに簡単にバックポートできます。 Android カーネル チームは、 Android エコシステムの利益のためにアップストリームの取り組みを喜んでサポートします。
パッチをGerritに提出し、これらの貢献ガイドラインに従ってください。