Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

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 固有の最新のバグ修正を常に適用しておくことが強く推奨されます。

用語

ここでは、Android 共通カーネルのポリシーを説明するためにこのドキュメントで使用する新しい用語について説明します。

機能カーネル

最新の Android プラットフォーム リリース向けの機能が追加されたカーネルを、機能カーネルと呼びます。Android 11 の場合、機能カーネルはカーネル バージョン 4.14.y、4.19.y、5.4.y に基づいています。以前のプラットフォーム リリースでは、機能カーネルはローンチ カーネルと同じでした。しかし、Android S(AOSP 試験運用版)では、機能カーネルが 2 種類、ローンチ カーネルが 3 種類存在します。

汎用カーネル イメージ

Android 11 以降、Android 共通カーネルを使用して汎用カーネル イメージ(GKI)が作成されています。これは、ベンダー モジュールに SoC およびドライバのサポートが実装されているあらゆるデバイスを実行するために使用できる Aarch64 カーネル イメージです。詳細については、GKI の概要をご覧ください。

カーネル モジュール インターフェース

GKI では、ベンダー モジュールから非同期でコアカーネルのアップデートができるように、安定版のカーネル モジュール インターフェース(KMI)という概念を導入しています。KMI がフリーズ(固定)されると、既存のベンダー モジュールとのバイナリ互換性を損なうような変更は行えなくなります。KMI の詳細については、GKI の概要をご覧ください。

ローンチ カーネル

指定されたローンチ カーネルを使用することで、特定の Android プラットフォーム リリースでデバイスを起動できます。Android 11 の場合、カーネル バージョン 4.14.y、4.19.y、5.4.y に基づくカーネルによってデバイスを起動できます。

共通カーネル ブランチ タイプ

KMI カーネル ブランチ

KMI カーネルは、安定版のカーネル モジュール インターフェースを備えています。KMI はカーネル バージョンと Android プラットフォーム リリースによって一意に識別されるため、ブランチは <androidRelease>-<kernel version> という名前になります。たとえば、Android 11 の 5.4 KMI カーネルの名前は android11-5.4. です。Android S(AOSP 試験運用版)には、android12-5.4android12-5.10 という 2 つの追加 KMI カーネルがあります。

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

レガシーのデザート カーネルは、新しい機能の開発が Android 共通カーネルからのマージを妨げないことを保証する目的で作成されました。これらのブランチは、関連するデザート リリースに先立って作成されました。LTS から定期的なマージが行われますが、新しい機能は提供されません。たとえば、android-4.9-q には LTS 4.9.y ブランチからのマージが行われます。

カーネル バージョンがローンチ カーネルではない場合、デザート カーネルは作成されませんでしたが、最新のプラットフォーム リリースに関連付けられたカーネルは、今後の Android プラットフォーム リリースへのアップグレードに使用できます。たとえば、android-4.4-p は最後の android-4.4* デザート ブランチだったので、元のプラットフォーム リリースである Android 9(Pie)でサポートおよびテストされています。また、4.4 カーネルを実行するデバイスのアップグレードをサポートするプラットフォーム リリース(Android 10 と Android 11)でもサポートおよびテストされています。

Android プラットフォーム リリースのデザート命名スキームは、Android 10 で破棄されました。そのスキームに基づけば android-4.14-r および android-4.19-r と言う名前になるはずだった最後のデザート リリースは、代わりに android-4.14-stable および android-4.19-stable という名前になりました。

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

Android プラットフォーム リリース カーネル サポート期限
Android 8.1(Oreo) android-4.4-o
android-4.9-o
2021 年 6 月
Android 9(Pie) android-4.4-p
android-4.9-p
android-4.14-p
2022 年 1 月
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 月

レガシーのリリース カーネル ブランチ

リリース カーネルは、毎月の Android のセキュリティに関する公開情報に掲載されているパッチのバックポートを提供するために維持されています。新しい Android プラットフォームがリリースされるたびに、ローンチ カーネルごとにリリース カーネルが作成されていました。サポート期間とセキュリティ パッチで説明されているように、リリース カーネルは、関連するカーネルまたはプラットフォーム リリースのサポート終了に伴って、サポート終了となります。

Android のセキュリティに関する公開情報が毎月公開されるたびに、アップストリーム カーネルと Android 共通カーネルに関連する公開情報に掲載されているパッチのバックポートが、これらのリリース カーネルに適用されます。LTS パッチは提供されないため、マイナー バージョン番号は変更されません。ベンダー固有のパッチに対するバックポートは含まれません。

Android 11 以降のプラットフォーム リリースでは、パートナーはデザートまたは KMI カーネルからマージを行って、Android のセキュリティに関する公開情報に掲載されているパッチを適用する必要があります。Android 11 以降のプラットフォーム リリースではリリース カーネルは作成されません。

したがって、この表は 14 件のリリース カーネルを示した完全なリストであり、今後リリース カーネルが追加されることはありません。

Android プラットフォーム リリース カーネル サポート期限
Android 8.0(Oreo) android-3.18-o-release
android-4.4-o-release
android-4.9-o-release
2021 年 1 月
Android 8.1(Oreo MR1) android-3.18-o-mr1
android-4.4-o-mr1
android-4.9-o-mr1
2021 年 6 月
Android 9(Pie) android-4.4-p-release
android-4.9-p-release
android-4.14-p-release
2022 年 1 月
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 S(AOSP 試験運用版)以降は、サポートする必要がある安定版の KMI の数を減らすために、機能カーネルの数はローンチ カーネルよりも少なくなります。

Android プラットフォーム リリース ローンチ カーネル 機能カーネル
Android 9(2018) android-4.4-p
android-4.9-p
android-4.14-p
android-4.4-p
android-4.9-p
android-4.14-p

Android 10(2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
Android 11(2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
Android S(AOSP 試験運用版)(2021) android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T(AOSP 試験運用版)(2022)1 android12-5.4
android12-5.10
android13-5.10
android13-5.x
android13-5.10
android13-5.x2

1 Android T(AOSP 試験運用版)(2022)は確定されたリリースではありません。新しい分岐モデルの 2 つの機能カーネルと 3 つのローンチ カーネルが今後どのように展開されるかを示す例として記載されています。

2 ここに記載されている 5.x は、2021 年の終わりに LTS として選択されるカーネル バージョンを表しています。

共通カーネルの階層

android-mainline からの分岐

共通カーネル階層のトップレベルを図 1 に示します。

android-mainline カーネルからの共通カーネルの作成

図 1:android-mainline カーネルからの共通カーネルの作成

新しい Android 共通カーネル android12-5.10 は、2020 年に android-mainline から分岐しました。2021 年に次の LTS が宣言されると、android13-5.x(5.x.y は LTS として選択されるカーネル バージョン)が android-mainline から分岐します。

図 1 に示すように、各カーネル バージョンは 2 つの KMI カーネルの基礎となります。たとえば、2 つの v5.4 カーネルは android11-5.4android12-5.4 で、どちらもそれぞれのプラットフォーム リリースの機能カーネルです。5.10 の場合も同様に、LTS が宣言されたときに android12-5.10 が作成され、2021 年春にカーネル機能の完全実装のマイルストーンに到達すると android13-5.10android12-5.10 から分岐して、Android T(AOSP 試験運用版)向けの機能の開発が可能になります。

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

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

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

図 2. 5.10 KMI ブランチのライフサイクル

開発プロセスとブランチのライフサイクルを明確にするために、図 2 は 5.10 の KMI ブランチに焦点を当てています。

各 KMI ブランチは、図 2 で各ブランチで異なる色によって示されている 3 つのフェーズを繰り返します。上記のように、LTS は、フェーズに関係なく定期的にマージされます。

開発フェーズ

作成された KMI ブランチは開発フェーズ(図 2 では dev)に入り、Android プラットフォームの次期リリースに向けて機能の提案や提出を受け付けます。図 2 では、5.10 が新しいアップストリーム LTS カーネルとして宣言されたときに、android12-5.10 が作成されています。後続リリースの開発を可能にするために、カーネル バージョンの 2 番目の KMI ブランチが早めに作成されることもあります。図 2 では、android12-5.10 が開発フェーズから移行したときに android13-5.10 が作成されています。

安定化フェーズ

KMI ブランチは、機能の完全実装が宣言されると、安定化フェーズ(図 2 では stab)に入ります。パートナー機能とバグ修正は引き続き受け入れられますが、インターフェースに影響する変更を検出するために KMI トラッキングが有効になります。このフェーズでは、KMI の互換性を損なう変更も受け入れられますが、必要に応じて KMI 定義を更新する必要が生じます。KMI モニタリングの詳細については、GKI の概要をご覧ください。

KMI フリーズ(固定)フェーズ

新しいプラットフォーム リリースが AOSP にプッシュされる前に、KMI ブランチがフリーズ(固定)され、ブランチのライフタイム期間はこの状態が維持されます。つまり、基本的に KMI の互換性を損なう変更は受け入れられません。ただし、安定版の KMI に影響を及ぼさずに対処することが不可能な重大なセキュリティ問題が特定された場合は、その限りではありません。KMI の互換性が損なわれるのを避けるため、Android デバイスの修正が必要でなければ、LTS からマージされたパッチが変更または削除される場合があります。

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);

KMI カーネルのライフタイムを通じて、ユーザー空間との下位互換性が維持されるので、KMI カーネルはデバイスがローンチされる Android プラットフォーム リリースに安全に使用できます。以前のリリースに対して継続的なテストを実施することで、互換性の維持が確保されます。そのため、図 2 では、Android S(AOSP 試験運用版)デバイスと Android T(AOSP 試験運用版)デバイスに android12-5.10 カーネルを使用できます。Android プラットフォーム リリースは以前のバージョンとも互換性があるため、android12-5.4 カーネルは Android T(AOSP 試験運用版)デバイスのローンチとアップグレードに使用できます。

固定フェーズに入ると、ブランチには、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 世代が変更されることは、きわめてまれです。

カーネル間の互換性

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

KMI カーネル

新しい KMI カーネルは、カーネル バージョンをサポートしていたすべての Android プラットフォーム リリースとの下位互換性を維持します。そのため、Android S(AOSP 試験運用版)用に開発された android12-5.4 カーネルは、Android 11 を実行するデバイスで安全に使用できます。以前のリリースで安定版のカーネルの VTS および CTS テストを継続的に実施することで、互換性の維持が確保されます。

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

レガシーのカーネル

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

互換性マトリックス

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

Android プラットフォーム リリース アップグレードがサポートされているカーネル ローンチがサポートされているカーネル
Android 9(2018) android-3.10
android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
Android 10(2019) android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
android-4.9-q
android-4.14-q
android-4.19-q
Android 11(2020) android-4.4-o
android-4.4-p
android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
Android S(AOSP 試験運用版)(2021) android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10

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

Android 共通カーネルは、関連する LTS カーネルまたは Android プラットフォーム リリースのサポートが終了するまでサポートされます。サポートされている間、カーネルはアップストリームからの LTS マージと Android 固有のコードのバグ修正を引き続き受け取ります。この修正には、Android 共通カーネルに関連する毎月の Android のセキュリティに関する公開情報に掲載されるカーネル セキュリティ パッチがすべて含まれます。

パートナーは、Android 共通カーネルからのマージを定期的に行うことで、入手可能なすべてのカーネル セキュリティ パッチを確実に取得できます。

共通カーネルのテスト

共通カーネルは、ベンダーによるダウンストリーム テストに加えて、いくつかの CI システムでテストされます。

Linaro カーネル機能テスト

Linaro カーネル機能テスト(LKFT)によって、一連の物理的 arm32 および arm64 デバイス上で、kselftest、LTP、VTS、CTS などのさまざまなテストスイートが開始されます。最近のテスト結果については、こちらをご覧ください。

KernelCI テスト

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

Android の presubmit テストと postsubmit テスト

presubmit テストは、共通カーネルにエラーが入り込むのを防ぐために使用されます。現時点では、結果の一般公開はされていません。

Android postsubmit テストは、共通カーネル ブランチに新しいカーネルが commit されるときに実施されます。ブランチ名の一部として aosp_kernel を入力すると、該当するカーネル ブランチのリストが表示されます。たとえば、android-mainline の結果はこちらで確認できます。

ゼロデイテスト

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

テスト マトリックス

Android 共通カーネル Android プラットフォーム リリース テストスイート
マスター 11 10 9(Pie) 8(Oreo) LKFT KernelCI Pre Submit Post Submit ゼロデイ
android-mainline
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q
android-4.14-q
android-4.9-q
android-4.14-p
android-4.9-p
android-4.4-p
android-4.9-o
android-4.4-o
android-3.18

Android 共通カーネルへの改善協力

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

Gerrit にパッチを送信し、これらの改善協力ガイドラインに従ってください。