將核心功能設為 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. 如果是 Android 14,請將步驟 2 中的同一組 KO 檔案新增至 common/android/gki_{ARCH}_protected_modules,並依遞增順序排序,以便在執行階段進行二分搜尋,將模組指定為受保護的 GKI 模組。

  4. 如果是 Android 14 和 15,請更新匯出清單,加入 common/android/abi_gki_protected_exports_ARCHITECTURE 中新加入的匯出項目。舉例來說,如要更新清單,請針對 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports 執行 aarch64

  5. 請確認步驟 2 中新增的 KO 檔案已複製到核心的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gzsystem_dlkm_staging_archive.tar.gz 封存中的模組可用於生成平台建構中的 system_dlkm.img

  6. 將變更送審。GKI 模組是 Android 專屬的 Kernel 功能,因此不必向上游提交模組轉換修補程式。不過,您必須遵循其他規範,才能提交 Android Common Kernel (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. 如果是 Android 14,請將步驟 2 中的同一組 KO 檔案新增至 common/android/gki_{ARCH}_protected_modules,並依遞增順序排序,以便在執行階段進行二分搜尋,將模組指定為受保護的 GKI 模組。

  4. 如果是 Android 14 和 15,請更新受保護的匯出項目清單,將 common/android/abi_gki_protected_exports_{ARCH} 中新加入的模組項目納入其中 (使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports 適用於 aarch64)。

  5. 請務必將步驟 2 中新轉換的模組 KO 檔案複製到核心的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gzsystem_dlkm_staging_archive.tar.gz 封存中的模組可用於生成平台建構中的 system_dlkm.img

  6. 將變更送審。GKI 模組是 Android 專屬的 Kernel 功能,因此不必向上游提交模組轉換修補程式。不過,您必須遵循其他規範,才能提交 Android Common Kernel (ACK) 修補程式

將受保護的 GKI 模組轉換為不受保護的模組

  1. 如果是 Android 15 以上版本,請將要從受保護轉換為不受保護的模組,新增至 common/modules.bzl 檔案中的 COMMON_UNPROTECTED_MODULES_LIST 清單。

  2. 如果是 Android 14,請從 common/android/gki_protected_modules 的受保護模組清單中,移除要從受保護轉換為不受保護的模組。

  3. 如果是 Android 14 和 15,請更新受保護的匯出項目清單,排除 common/android/abi_gki_protected_exports_{ARCH} 中新轉換的不受保護模組,方法是使用 aarch64tools/bazel run //common:kernel_aarch64_abi_update_protected_exports aarch64

  4. 將變更送審。GKI 模組是 Android 專屬的 Kernel 功能,因此不必向上游提交模組轉換修補程式。不過,您必須遵循其他規範,才能提交 Android Common Kernel (ACK) 修補程式

GKI 模組符號違規問題解決快速指南

如果未簽署的模組違反 GKI 模組的符號保護機制,載入模組時可能會遇到兩種錯誤,導致失敗。

1. 使用受保護符號的未簽署模組

錯誤:

module: Protected symbol: some_kernel_function (err -13)

原因:

module.ko 檔案是未簽署的供應商模組,並嘗試在載入期間解析匯出的 GKI 模組符號 some_kernel_function,但未列在供應商符號清單中。

解決方法:

如果 module.ko 不是受保護的 GKI 模組,更新符號清單即可解決錯誤,方法是將 some_kernel_function 加入供應商符號清單。或者,您也可以使用 module.ko 的 GKI 版本。

2. 匯出受保護符號的未簽署模組

錯誤:

module: exports protected symbol some_kernel_function

原因:

匯出 some_kernel_function 的模組是受保護的 GKI 模組,而 module.ko 可能是該模組的未簽署自訂版本。當 module.ko 嘗試匯出 some_kernel_function 時,由於 some_kernel_function 只能由已簽署的 GKI 模組匯出,因此載入會失敗並顯示這則訊息。

解決方法:

如果未簽署的模組是自訂版本,可以使用匯出 some_kernel_function 的模組 GKI 版本修正這個問題。