カーネル機能を GKI モジュールとして設定する

このページでは、新しいカーネル機能を GKI モジュールとして構成する方法と、既存の組み込みカーネル機能を GKI モジュールとして構成する方法について説明します。

新しい機能を GKI モジュールとして構成する

  1. 新しい機能の場合、gki_defconfig を編集して、必要なカーネル機能の構成項目を n から m=m)に設定します。この設定は、arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig の両方で行います。

  2. その機能用に生成された KO(.ko)ファイルを common/modules.bzlCOMMON_GKI_MODULES_LIST セクションに追加します。ファイルは整列順で追加します。生成されたファイルが不明でも、ビルドすればエラーとなって、リストに追加すべき KO ファイルが表示されます。

  3. ステップ 2 の各 KO ファイルを、実行時のバイナリ検索用に昇順で並べ替えて common/android/gki_{ARCH}_protected_modules に追加し、このモジュールを保護された GKI モジュールとして指定します。aarch64tools/bazel run //common:kernel_aarch64_abi_update_protected_exports を使用して、common/android/abi_gki_protected_exports_{ARCH} に新しく追加されたモジュールが含まれるように、保護されたエクスポートのリストを更新します。保護された GKI モジュールとして指定されるモジュールであっても、公式の保護されたモジュールとして Google の承認を得る必要があります。

  4. ステップ 2 の新しく追加された KO ファイルがカーネルの out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz にコピーされているか確認します。system_dlkm_staging_archive.tar.gz アーカイブ内のモジュールは、プラットフォーム ビルドの system_dlkm.img を生成するための入力として使用できます。

  5. 変更内容を審査のために提出します。GKI モジュールは Android 専用のカーネル機能であるため、モジュール変換パッチをアップストリームに提出する必要はありません。ただし、Android 共通カーネル(ACK)のパッチを提出する場合は、他のガイドラインに従う必要があります。

カーネル組み込み機能を GKI モジュールとして構成する

  1. 既存の組み込みカーネル機能の場合、gki_defconfig を編集して、必要なカーネル機能の構成項目を y から m=m)に設定します。この設定は、arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig の両方で行います。

  2. その機能用に生成された KO(.ko)ファイルを common/modules.bzlCOMMON_GKI_MODULES_LIST セクションに追加します。ファイルは整列順で追加します。生成されたファイルが不明でも、ビルドすればエラーとなって、リストに追加すべき KO ファイルが表示されます。

  3. ステップ 2 の各 KO ファイルを、実行時のバイナリ検索用に昇順で並べ替えて common/android/gki_{ARCH}_protected_modules に追加し、このモジュールを保護された GKI モジュールとして指定します。aarch64tools/bazel run //common:kernel_aarch64_abi_update_protected_exports を使用して、common/android/abi_gki_protected_exports_{ARCH} に新しく追加されたモジュールが含まれるように、保護されたエクスポートのリストを更新します。保護された GKI モジュールとして指定されるモジュールであっても、公式の保護されたモジュールとして Google の承認を得る必要があります。

  4. ステップ 2 の新しく変換されたモジュール KO ファイルがカーネルの out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz にコピーされているか確認します。system_dlkm_staging_archive.tar.gz アーカイブ内のモジュールは、プラットフォーム ビルドの system_dlkm.img を生成するための入力として使用できます。

  5. 変更内容を審査のために提出します。GKI モジュールは Android 専用のカーネル機能であるため、モジュール変換パッチをアップストリームに提出する必要はありません。ただし、Android 共通カーネル(ACK)のパッチを提出する場合は、他のガイドラインに従う必要があります。

保護された GKI モジュールを保護されていないモジュールに変換する

  1. 保護された状態から保護されていない状態に変換されたモジュールを、common/android/gki_protected_modules の保護されたモジュールのリストから削除します。

  2. aarch64tools/bazel run //common:kernel_aarch64_abi_update_protected_exports を使用して、common/android/abi_gki_protected_exports_{ARCH} の新しく変換された保護されていないモジュールが除外されるように、保護されたエクスポートのリストを更新します。

  3. 変更内容を審査のために提出します。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_functionmodule.ko がエクスポートしようとすると、読み込みが失敗し、このメッセージが返されます。

解決策:

some_kernel_function をエクスポートするモジュールの GKI バージョンを使用することで解決できます(未署名のモジュールがカスタム バージョンの場合)。