Android共通カーネル

AOSP 共通カーネル(Android 共通カーネルまたはACKとも呼ばれます) は、 kernel.orgカーネルの下流にあり、メインラインまたは長期サポート (LTS) カーネルにマージされていない Android コミュニティにとって重要なパッチが含まれています。これらのパッチには次のものがあります。

  • Android 機能に必要なアップストリーム機能のバックポートとチェリーピック
  • Android デバイス向けの準備ができているが、まだアップストリームで開発中の機能 (たとえば、Energy Aware Scheduler タスク配置の最適化)。
  • 他のエコシステム パートナーに役立つベンダー/OEM 機能 (sdcardfs など)。

android-mainline 、Android 機能の主要な開発ブランチです。 Linux メインラインは、Linus Torvalds がリリースまたはリリース候補を投稿するたびにandroid-mainlineにマージされます。 2019 年以前は、最近宣言された LTS カーネルを複製し、Android 固有のパッチを追加することで、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月

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

リリース カーネルは、毎月のAndroid Security Bulletinで引用されているパッチのバックポートを提供するために維持されています。これらは、新しい 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-4.19-qなどの Android 10 用に設計されたカーネルは、プラットフォーム リリースを Android 11 にアップグレードした後でもデバイスで使用できます。サポートする必要がある安定した KMI。

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
アンドロイド 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 12 (2021) android-4.19-stable
android11-5.4 1
android12-5.4
android12-5.10
android12-5.4
android12-5.10
アンドロイド 13 (2022) android11-5.4 1
android12-5.4 1
android12-5.10 1
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1関連する BSP がプラットフォーム リリース用に更新されている場合、追加の制限が適用される場合があります。より一般的に言えば、カーネルのAndroid リリース番号は、ターゲットの FCM バージョン以上である必要があります。詳細については、ベンダー インターフェイス オブジェクト - カーネル ブランチの一致を参照してください。

共通のカーネル階層

android-mainline からの分岐

共通カーネル階層の最上位を図 1 に示します。

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

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

2020 年に新しい Android 共通カーネルandroid12-5.10android-mainline android-mainlineから分岐したことandroid13-5.15注意してください。

図 1 に示すように、各カーネル バージョンは 2 つの GKI カーネルの基礎となります。たとえば、2 つの v5.4 カーネルはandroid11-5.4android12-5.4であり、どちらもそれぞれのプラットフォーム リリースの機能カーネルです。これは 5.10 でも同様です。 android12-5.10は、LTS が宣言されたときに作成されましたandroid13-5.10 、Android 13 の機能の開発を可能にするために、2021 年春のカーネル機能の完全なマイルストーンでandroid12-5.10から分岐します。

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 でstabとラベル付けされた安定化フェーズに入ります。パートナーの機能とバグ修正は引き続き受け入れられますが、インターフェイスに影響を与える変更を検出するために KMI 追跡が有効になります。このフェーズでは、KMI を壊す変更は受け入れられますが、必要に応じて KMI 定義を更新する必要があります。 KMI モニタリングの詳細については、GKI の概要を参照してください。

KMI凍結相

新しいプラットフォーム リリースが AOSP にプッシュされる前に、ACK KMI ブランチは凍結され、ブランチの存続期間中凍結されたままになります。これは、安定した KMI に影響を与えずに緩和できない重大なセキュリティ問題が特定されない限り、KMI を壊す変更は受け入れられないことを意味します。 KMI の破損を回避するために、LTS からマージされた一部のパッチは、修正が Android デバイスに必要ない場合に変更または削除される可能性があります。

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 13 を実行しているデバイスで Android 12 用に開発されたandroid12-5.4カーネルを安全に使用できます。互換性は、サポートされているすべてのリリースで GKI カーネルの継続的な VTS および CTS テストによって検証されます。

KMI は安定しているため、ベンダー イメージでカーネル モジュールを再構築しなくてもカーネルを更新できます。

KMI の互換性は、異なる GKI カーネル間では維持されません。したがって、たとえば、 android12-5.10android13-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 プラットフォームのリリースアップグレードがサポートされているカーネル起動用にサポートされているカーネル
アンドロイド 10 (2019) android-3.18 (EOL)
android-4.4-o (EOL)
android-4.9-o
android-4.4-p
(EOL)
android-4.9-p (EOL)
android-4.14-p (EOL)
android-4.9-q
android-4.14-q
android-4.19-q
アンドロイド 11 (2020) android-4.4-o (EOL)
android-4.4-p (EOL)
android-4.9-o (EOL)
android-4.9-p (EOL)
アンドロイド-4.9-q
android-4.14-p (EOL)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
Android 12 (2021) android-4.9-o (EOL)
android-4.9-p (EOL)
android-4.9-q
android-4.14-p
(EOL)
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
アンドロイド 13 (2022) android-4.9-q
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
android13-5.10
android13-5.15
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15

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

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

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

一般的なカーネル テスト

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

Linaro カーネル機能テスト

Linaro Kernel Functional Testing (LKFT)テストは、kselftest、LTP、VTS、および CTS を含むさまざまなテスト スイートを一連の物理的な arm32 および arm64 デバイスで開始します。最近のテスト結果はこちらでご覧いただけます。

KernelCI テスト

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

Android の送信前および送信後のテスト

送信前テストは、共通カーネルに障害が持ち込まれるのを防ぐために使用されます。現時点では、結果は公開されていません。

Android の送信後テストは、新しいパッチが共通のカーネル ブランチにコミットされるときに実行されます。 aosp_kernelブランチ名の一部として入力すると、結果が利用可能なカーネル ブランチのリストが表示されます。たとえば、 android-mainlineの結果はこちらで確認できます。

ゼロデイテスト

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

テスト マトリックス

Android 共通カーネルAndroid プラットフォームのリリーステスト スイート
マスター13 12 11 10 9 (パイ) LKFTカーネルCI事前提出投稿する0日
android-mainline
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
android-4.14-q
android-4.9-q

Android 共通カーネルへの貢献

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

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