ベンダー モジュールの KMI を安定させることは非常に重要です。GKI カーネルはバイナリ形式でビルドされて出荷され、ベンダーの読み込み可能モジュールは別のツリーでビルドされます。生成される GKI カーネルとベンダー モジュールは、合わせてビルドされたかのように動作する必要があります。
一般に、Linux コミュニティはメインライン カーネルのカーネル内 ABI の安定性という概念に難色を示してきました。さまざまなツールチェーンや構成が存在し、Linux メインライン カーネルも進化し続ける中で、メインラインで安定版の KMI を維持することは不可能です。ただし、次のような高度な制約が設定された GKI 環境では、安定した KMI を維持できます。
カーネルのビルドに使用できる構成は
gki_defconfig
1 つのみである。KMI は、
android13-5.10
、android12-5.10
、android13-5.15
など、同じ LTS と Android バージョンのカーネル内でのみ安定する。android-mainline
については、KMI の安定性は維持されない。
カーネルとモジュールのビルドには、AOSP で提供され、対応するブランチに対して定義された特定の Clang ツールチェーンのみが使用される。
シンボルリストで指定されたモジュールで使用されることがわかっているシンボルのみが、安定性をモニターされ、KMI シンボルとみなされる。
- 必然的に、ベンダー モジュールは KMI シンボルのみを使用する必要がある。この制約は、KMI 以外のシンボルが必要な場合にモジュールを読み込まないようにすることで適用されます。
KMI ブランチが固定された後は、変更は可能であるが、KMI の互換性を損なう変更はできない。該当する変更には次のようなものがあります。
- 構成の変更
- カーネルコードの変更
- ツールチェーンの変更(アップデートを含む)
密閉型のビルドプロセスと LLVM ツールチェーンの使用
密閉型のビルドプロセスでは、kernel/manifest
内の repo
マニフェストにビルド環境を完全に記述することにより、安定した KMI が確保されます。たとえば、android13-5.15
のマニフェストには、ツールチェーン、ビルド スクリプトなど、汎用カーネル イメージ(GKI)カーネルのビルドに必要なすべてのものが含まれています。GKI ビルド構成 build.config.gki.aarch64
などのそれぞれの build.config
構成ファイルにより、含まれているツールが正しく使用され、一貫したビルド結果が生成されます。
密閉型のビルドプロセスを使用すると、ツリーの ABI の記述の整合性が保たれます。これは Google が生成したもの(android13-5.15
の abi_gki_aarch64.xml
など)でも、ベンダー モジュールなどのローカルツリーで生成されたものでも同様です。カーネル モジュール インターフェース(KMI)の ABI の記述を作成して比較するためのツールも、マニフェストで説明されているリポジトリの一部として提供されています。
GKI カーネルのビルドに使用するツールチェーンは、ベンダー モジュールをビルドするために使用するツールチェーンと完全互換である必要があります。Android 10 以降、すべての Android カーネルは LLVM ツールチェーンでビルドする必要があります。GKI では、プロダクト カーネルとベンダー モジュールをビルドするために使用する LLVM ツールチェーンで、AOSP の LLVM ツールチェーンと同じ ABI を生成する必要があります。また、パートナーは KMI が GKI カーネルと互換性があることを確認する必要があります。 提供されているビルドツールを使用することを強くおすすめします。これにより互換性が保証されます。
次のステップ
密閉型のビルドプロセスと LLVM ツールチェーンを使用してカーネルをビルドする手順については、カーネルのビルドをご覧ください。
ABI をモニタリングし、問題を修正する方法については、Android カーネル ABI のモニタリングをご覧ください。