Android 共通カーネル

AOSP 共通カーネル(Android 共通カーネルまたは ACK とも呼ばれます)は kernel.org カーネルのダウンストリームであり、メインラインまたは長期サポート(LTS)カーネルにはマージされていないものの Android コミュニティにとって関心のあるパッチが含まれています。たとえば以下のようなパッチがあります。

  • Android 機能に必要なアップストリーム機能のバックポートと cherry-pick
  • Android デバイス向けには準備が整っているが、まだ開発アップストリームにある機能(例: Energy-Aware Scheduler のタスク配置最適化)。
  • ベンダーや OEM の機能であるが、他のエコシステム パートナーにも有用なもの(例: sdcardfs)

android-mainline は Android 機能向けの主要開発ブランチです。リーナス トーバルズ氏がリリースまたはリリース候補を掲載すると、その都度 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 の場合、新しい GKI カーネルが 2 つ(android12-5.4android12-5.10)が追加されています。

レガシーのデザート カーネル ブランチ

レガシーのデザート カーネルは、新しい機能の開発が 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-randroid-4.19-r という名前になるはずだった最後のデザート リリースは、代わりに android-4.14-stableandroid-4.19-stable という名前になりました。

Android 11 以降、デザート カーネルは GKI カーネルに置き換えられています。そのため、以下の表は、サポートされるすべてのデザート カーネルのリストとなります。

Android プラットフォーム リリース カーネル サポート期限
Android 10 android-4.9-q
android-4.14-q
android-4.19-q
2023 年 1 月
Android 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 プラットフォーム リリース カーネル サポート期限
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-stableandroid11-5.4 です。

通常はプラットフォーム リリースのアップデート時にカーネルをアップグレードする必要はないため、プラットフォーム リリースの最新機能が存在しないカーネルでもデバイスのローンチに使用できます。したがって、プラットフォーム リリースを Android 11 にアップグレードした後でも、Android 10 用に設計されたカーネル(android-4.19-q など)を引き続きデバイスで使用できます。Android 12 以降は、サポートする必要がある安定版の KMI の数を減らすために、機能カーネルの数はローンチ カーネルよりも少なくなります。

Android プラットフォーム リリース ローンチ カーネル 機能カーネル
Android 14(2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.101
android14-6.1
android14-5.15
Android 13(2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12(2021) android12-5.10
android12-5.4
android11-5.41
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.15android-mainline から分岐しました。

図 1 に示すように、各カーネル バージョンは 2 つの GKI カーネルの基礎となります。たとえば、2 つの v5.4 カーネルは android11-5.4android12-5.4 で、どちらもそれぞれのプラットフォーム リリースの機能カーネルです。5.10 の場合も同様に、LTS が宣言されたときに android12-5.10 が作成され、2021 年春にカーネル機能の完全実装のマイルストーンに到達すると android13-5.10android12-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 では、android12-5.10 が開発フェーズから移行したときに android13-5.10 が作成されています。

安定化フェーズ

ACK KMI ブランチは、機能の完全実装が宣言されると、安定化フェーズ(図 2 では stable)に入ります。パートナー機能とバグ修正は引き続き受け入れられますが、インターフェースに影響する変更を検出するために 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 カーネルのライフタイムを通じて、ユーザー空間との下位互換性が維持されるので、KMI カーネルはデバイスがローンチされる Android プラットフォーム リリースに安全に使用できます。以前のリリースに対して継続的なテストを実施することで、互換性の維持が確保されます。そのため、図 2 では、Android 12 デバイスと Android 13 デバイスに android12-5.10 カーネルを使用できます。Android プラットフォーム リリースは以前のバージョンとも互換性があるため、android12-5.4 カーネルは Android 13 デバイスのリリースとアップグレードに使用できます。

KMI 世代番号

安定化フェーズの間に LTS マージが行われる場合や、このマージの後に KMI 変更パッチの受理を必要とするセキュリティの問題やその他のイベントが発生した場合は、build.config.common で記録される KMI 世代番号が上がります。現在の KMI 世代は uname コマンドを使用して確認できます。

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

プラットフォーム リリースの後の数字は KMI 世代を表します(この場合は 0)。

KMI 世代が変更された場合、以前の KMI 世代に適合したベンダー モジュールとの互換性がカーネルになくなるため、モジュールをビルドし直して、カーネルと同期する状態に更新する必要があります。KMI が固定されると、KMI 世代が変更されることは、きわめてまれです。

カーネル間の互換性

新しい GKI カーネルから、同じ LTS ファミリー内のカーネル間の互換性要件が変更されます。

GKI カーネル

GKI カーネルは、カーネル バージョンをサポートしていたすべての Android プラットフォーム リリースとの下位互換性を維持します。また、Android プラットフォーム リリースは、以前のリリースの GKI カーネルとの下位互換性があります。そのため、Android 12 用に開発された android12-5.4 カーネルは、Android 13 を実行するデバイスで安全に使用できます。互換性は、サポートされているすべてのリリースで GKI カーネルの継続的な VTS テストと CTS テストを行うことで検証されています。

KMI は安定版であるため、ベンダー イメージ内のカーネル モジュールをビルドし直さなくてもカーネルを更新できます。

KMI 互換性は、異なる GKI カーネル間では維持されません。そのため、たとえば android12-5.10android13-5.10 カーネルに置き換えるには、すべてのモジュールを再ビルドする必要があります。

GKI カーネルは、初回とそれ以降のリリースでのみサポートされます。また、古いリリースではサポートされていません。したがって、Android 12 デバイスでは android13-5.10 カーネルはサポートされていません。

レガシーのカーネル

レガシーのデザート カーネル(*-q*-stable)には Android プラットフォーム リリースをまたぐ下位互換性はありませんが、過去 2 つの Android プラットフォーム リリースのカーネルはアップグレードがサポートされています。したがって、android-4.19-q に基づくカーネルを使用して Android 10 でローンチされたデバイスは、Android 2020 へのアップグレードの際に引き続き android-4.19-q カーネルを使用するか、ベンダー固有のコードを更新して android-4.19-stable をサポートできます。

互換性マトリックス

次の表に、各 Android プラットフォーム リリースでサポートおよびテストされているカーネル バージョンを示します。

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
Android 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 などのさまざまなテストスイートが開始されます。最近のテスト結果については、こちらをご覧ください。

KernelCI テスト

KernelCI ビルドアンドブート テストは、共通カーネル ブランチに新しいパッチが commit されるたびに開始されます。さまざまなボードで、数百種類のビルド構成がテストされ起動されます。Android カーネルの最近の結果はこちらで確認できます。

Android の presubmit テストと postsubmit テスト

presubmit テストは、Android 共通カーネルにエラーが入り込むのを防ぐために使用されます。テスト結果の概要は、Android 共通カーネル Gerrit のコード変更の [Checks] タブにあります。

ci.android.com で Android 共通カーネル ブランチに新しいパッチがコミットされると、Android 共通カーネル ブランチの新しい公開ビルドに対して Android の postsubmit テストが実行されます。ci.android.com でブランチ名の一部として aosp_kernel を入力すると、結果を利用できるカーネル ブランチのリストが表示されます。たとえば、android-mainline の結果はこちらで確認できます。特定のビルドをクリックすると、Test Results タブでテスト結果を確認できます。

Android プラットフォームのソースツリーでテストグループ kernel-presubmit を使用するテスト マッピングによって定義されたテストは、Android カーネル ブランチの presubmit として実行されます。たとえば、test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING にある以下の構成では、Android 共通カーネルコードのチェックイン時に vts_kernel_proc_file_api_test を presubmit テストとして有効にします。

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

ゼロデイテスト

ゼロデイテストでは、新しいパッチが commit されたときに、すべての Android 共通カーネル ブランチに対してパッチごとのテストが実施されます。さまざまなブートテスト、機能テスト、パフォーマンス テストが実行されます。公開グループ cros-kernel-buildreports に参加する

テスト マトリックス

Android 共通カーネル Android プラットフォーム リリース テストスイート
メイン 14 13 12 11 10 LKFT KernelCI Pre Submit Post Submit ゼロデイ
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 にパッチを送信し、これらの改善協力ガイドラインに従ってください。