このページでは、汎用カーネル イメージ(GKI)プロジェクトについて説明し、GKI によって Android の安定性とセキュリティが向上する仕組みについて解説します。
履歴
すべての Android 搭載デバイスには本番環境カーネルが必要です。GKI 以前のカーネルは Android Common Kernel(ACK)をベースとしたカスタム カーネルで、デバイス固有の変更はシステム オン チップ(SoC)ベンダーや OEM が実施していました。
こうしたカスタマイズの結果、カーネルコードの 50% がアップストリームの Linux カーネルや ACK に由来しないツリー外のコードになることがありました。このような GKI 以前のカーネルの性質が、カーネルの深刻な断片化につながっていました。
断片化の代償
カーネルの断片化は、Android コミュニティに悪影響を及ぼします。
セキュリティ アップデートに手間がかかる
Android のセキュリティに関する公開情報(ASB)に記載されているセキュリティ パッチは、各デバイス カーネルにバックポートする必要があります。しかし、カーネルの断片化が原因で、実際に利用中の Android デバイスにセキュリティ修正を反映させるには膨大なコストがかかります。
長期サポートのアップデートの統合が困難
長期サポート(LTS)リリースには、セキュリティ修正やその他の重要なバグの修正が含まれています。LTS リリースを最新の状態に保つことは、セキュリティ修正を提供する最も効果的な方法であることが証明されています。Pixel デバイスにおいて、ASB でレポートされたカーネル セキュリティに関する問題の 90% が、最新の状態のデバイスではすでに修正されていることが判明しました。
しかし、デバイス カーネルのカスタム変更をすべて適用しても、LTS 修正をデバイス カーネルに統合することは困難です。
Android プラットフォーム リリースのアップグレードが妨げられる
断片化により、カーネルの変更を必要とする Android の新機能を、利用中のデバイスに追加することが困難になります。Android フレームワークのコードではさまざまなカーネルをサポートする必要があり、カーネルに実装されている Android の新機能に依存することはできませんでした。これにより革新が遅れ、コードのサイズと複雑さの増大につながっていました。
アップストリームの Linux にカーネル変更を反映することが困難
本番環境カーネルにパッチを適用する方法が断片的だったため、LTS リリースがアップストリームで利用可能になってからデバイスに適用されるまでの間に、最大 18 か月の遅延が生じていました。アップストリームのカーネル リリースとプロダクトの間のこうした大きな遅延のため、Android コミュニティが必要な機能とドライバをアップストリームのカーネルに組み込むことは困難です。ユーザーが改善点の提案を送信する頃にはコードベースが変更されており、パッチの関連性を示すことも困難です。
断片化の修正: 汎用カーネル イメージ
汎用カーネル イメージ(GKI)プロジェクトは、コアカーネルを統合し、SoC とボードのサポートをコアカーネルから読み込み可能ベンダー モジュールに移動することで、カーネルの断片化に対処しています。また、GKI はベンダー モジュール用に安定版のカーネル モジュール インターフェース(KMI)を提供しています。これにより、モジュールとカーネルを別々に更新できます。以下に、GKI カーネルの特徴をいくつか示します。
- GKI カーネルは ACK ソースからビルドされます。
- GKI カーネルは、単一カーネル バイナリに、アーキテクチャごと、LTS リリースごとの関連する読み込み可能モジュールを加えたものです。
- GKI カーネルは、関連する ACK でサポートされるすべての Android プラットフォーム リリースでテストされます。GKI カーネル バージョンの全期間を通じて、機能が非推奨になることはありません。
- GKI カーネルは、特定の LTS 内のドライバに対して安定版の KMI を公開します。
- GKI カーネルには、SoC 固有またはボード固有のコードは含まれません。
GKI アーキテクチャのイメージについては、カーネルの概要をご覧ください。
一般的なイメージ
Android 12 以降では、出荷時にカーネル バージョン 5.10 以上を搭載するデバイスの場合、GKI カーネルを搭載して出荷する必要があります。汎用カーネル イメージ(GKI)リリースビルドは、LTS と重要なバグ修正で定期的に更新されます。KMI 用にバイナリの安定性が維持されるため、ベンダー イメージを変更しなくても、このようなブートイメージをインストールできます。GKI プロジェクトの目標は以下のとおりです。
- プロダクト カーネルを GKI カーネルに置き換える際に、パフォーマンスまたは電力の大幅な低下が発生しないようにする。
- ベンダーの関与なしでパートナーがカーネルのセキュリティ修正とバグ修正を提供できるようにする。
- デバイスのメジャー カーネル バージョンの uprev のコストを削減する。
- アップグレードの明確なプロセスを定めてカーネル バージョンを更新することにより、アーキテクチャごとに単一の GKI カーネル バイナリを保持する。