Android 共通カーネル

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.4android12-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-stableandroid-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 に示します。

android-mainline カーネルから共通カーネルを作成する

図 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.4android12-5.4で、どちらもそれぞれのプラットフォーム リリースの機能カーネルです。これは 5.10 にも当てはまります。 android12-5.10は LTS が宣言されたときに作成され、 android13-5.10 2021 年春のカーネル機能完了マイルストーンでandroid12-5.10から分岐し、Android 13 の機能の開発が可能になります。

ACK KMI ブランチのライフサイクル

ACK KMI ブランチのライフサイクルを以下の図 2 に示します。

5.10 ACK KMI ブランチのライフサイクル

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-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
アンドロイド 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

サポート期間とセキュリティ パッチ

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
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android-4.14-stable

Android 共通カーネルに貢献する

一般に、機能開発は Android 共通カーネルではなく、メインライン Linux で行う必要があります。アップストリーム開発が強く推奨されており、そこで開発が受け入れられた後は、必要に応じて特定の ACK ブランチに簡単にバックポートできます。 Android カーネル チームは、 Android エコシステムの利益のためにアップストリームの取り組みを喜んでサポートします。

パッチをGerritに提出し、これらの貢献ガイドラインに従ってください。