このページでは、新しいカーネル機能を GKI モジュールとして構成する方法と、既存の組み込みカーネル機能を GKI モジュールとして構成する方法について説明します。
新しい機能を GKI モジュールとして構成する
新しい機能の場合、
gki_defconfig
を編集して、必要なカーネル機能の構成項目をn
からm
(=m
)に設定します。この設定は、arch/arm64/configs/gki_defconfig
とarch/x86/configs/gki_defconfig
の両方で行います。その機能用に生成された KO(
.ko
)ファイルをcommon/modules.bzl
のCOMMON_GKI_MODULES_LIST
セクションに追加します。ファイルは整列順で追加します。生成されたファイルが不明でも、ビルドすればエラーとなって、リストに追加すべき KO ファイルが表示されます。ステップ 2 の各 KO ファイルを、実行時のバイナリ検索用に昇順で並べ替えて
common/android/gki_{ARCH}_protected_modules
に追加し、このモジュールを保護された GKI モジュールとして指定します。aarch64
のtools/bazel run //common:kernel_aarch64_abi_update_protected_exports
を使用して、common/android/abi_gki_protected_exports_{ARCH}
に新しく追加されたモジュールが含まれるように、保護されたエクスポートのリストを更新します。保護された GKI モジュールとして指定されるモジュールであっても、公式の保護されたモジュールとして Google の承認を得る必要があります。ステップ 2 の新しく追加された KO ファイルがカーネルの
out/<androidX-Y.Z>/dist/system_dlkm.img
とout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz
にコピーされているか確認します。system_dlkm_staging_archive.tar.gz
アーカイブ内のモジュールは、プラットフォーム ビルドのsystem_dlkm.img
を生成するための入力として使用できます。変更内容を審査のために提出します。GKI モジュールは Android 専用のカーネル機能であるため、モジュール変換パッチをアップストリームに提出する必要はありません。ただし、Android 共通カーネル(ACK)のパッチを提出する場合は、他のガイドラインに従う必要があります。
カーネル組み込み機能を GKI モジュールとして構成する
既存の組み込みカーネル機能の場合、
gki_defconfig
を編集して、必要なカーネル機能の構成項目をy
からm
(=m
)に設定します。この設定は、arch/arm64/configs/gki_defconfig
とarch/x86/configs/gki_defconfig
の両方で行います。その機能用に生成された KO(
.ko
)ファイルをcommon/modules.bzl
のCOMMON_GKI_MODULES_LIST
セクションに追加します。ファイルは整列順で追加します。生成されたファイルが不明でも、ビルドすればエラーとなって、リストに追加すべき KO ファイルが表示されます。ステップ 2 の各 KO ファイルを、実行時のバイナリ検索用に昇順で並べ替えて
common/android/gki_{ARCH}_protected_modules
に追加し、このモジュールを保護された GKI モジュールとして指定します。aarch64
のtools/bazel run //common:kernel_aarch64_abi_update_protected_exports
を使用して、common/android/abi_gki_protected_exports_{ARCH}
に新しく追加されたモジュールが含まれるように、保護されたエクスポートのリストを更新します。保護された GKI モジュールとして指定されるモジュールであっても、公式の保護されたモジュールとして Google の承認を得る必要があります。ステップ 2 の新しく変換されたモジュール KO ファイルがカーネルの
out/<androidX-Y.Z>/dist/system_dlkm.img
とout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz
にコピーされているか確認します。system_dlkm_staging_archive.tar.gz
アーカイブ内のモジュールは、プラットフォーム ビルドのsystem_dlkm.img
を生成するための入力として使用できます。変更内容を審査のために提出します。GKI モジュールは Android 専用のカーネル機能であるため、モジュール変換パッチをアップストリームに提出する必要はありません。ただし、Android 共通カーネル(ACK)のパッチを提出する場合は、他のガイドラインに従う必要があります。
保護された GKI モジュールを保護されていないモジュールに変換する
保護された状態から保護されていない状態に変換されたモジュールを、
common/android/gki_protected_modules
の保護されたモジュールのリストから削除します。aarch64
のtools/bazel run //common:kernel_aarch64_abi_update_protected_exports
を使用して、common/android/abi_gki_protected_exports_{ARCH}
の新しく変換された保護されていないモジュールが除外されるように、保護されたエクスポートのリストを更新します。変更内容を審査のために提出します。GKI モジュールは Android 専用のカーネル機能であるため、モジュール変換パッチをアップストリームに提出する必要はありません。ただし、Android 共通カーネル(ACK)のパッチを提出する場合は、他のガイドラインに従う必要があります。
GKI モジュールのシンボル違反の解決に関するクイックガイド
未署名のモジュールが GKI モジュールでのシンボル保護に違反している場合、モジュールの読み込み中に 2 種類のエラーが発生し、失敗する可能性があります。
1. 保護されたシンボルを使用する未署名のモジュール
エラー:
module: Protected symbol: some_kernel_function (err -13)
原因:
module.ko
ファイルは未署名のベンダー モジュールであり、ベンダー シンボルリストに記載されることなく、読み込み中に GKI モジュールのエクスポート済みシンボル some_kernel_function
の解決を試みます。
解決策:
module.ko
が保護された GKI モジュールでない場合、シンボルリストを更新するとベンダー シンボルリストに some_kernel_function
が組み込まれて、エラーが解決されます。また、GKI バージョンの module.ko
を使うという方法もあります。
2. 保護されたシンボルをエクスポートする未署名のモジュール
エラー:
module: exports protected symbol some_kernel_function
原因:
some_kernel_function
をエクスポートするモジュールは保護された GKI モジュールであり、module.ko
はそのモジュールの未署名のカスタム バージョンであると考えられます。署名済みの GKI モジュールだけがエクスポートできる some_kernel_function
を module.ko
がエクスポートしようとすると、読み込みが失敗し、このメッセージが返されます。
解決策:
some_kernel_function
をエクスポートするモジュールの GKI バージョンを使用することで解決できます(未署名のモジュールがカスタム バージョンの場合)。