本頁面說明如何將新的核心功能設定為 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 檔案。如果是 Android 14,請將步驟 2 中的同一組 KO 檔案新增至
common/android/gki_{ARCH}_protected_modules
,並依遞增順序排序,以便在執行階段進行二分搜尋,將模組指定為受保護的 GKI 模組。如果是 Android 14 和 15,請更新匯出清單,加入
common/android/abi_gki_protected_exports_ARCHITECTURE
中新加入的匯出項目。舉例來說,如要更新清單,請針對tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
執行aarch64
。請確認步驟 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 專屬的 Kernel 功能,因此不必向上游提交模組轉換修補程式。不過,您必須遵循其他規範,才能提交 Android Common Kernel (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 檔案。如果是 Android 14,請將步驟 2 中的同一組 KO 檔案新增至
common/android/gki_{ARCH}_protected_modules
,並依遞增順序排序,以便在執行階段進行二分搜尋,將模組指定為受保護的 GKI 模組。如果是 Android 14 和 15,請更新受保護的匯出項目清單,將
common/android/abi_gki_protected_exports_{ARCH}
中新加入的模組項目納入其中 (使用tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
適用於aarch64
)。請務必將步驟 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 專屬的 Kernel 功能,因此不必向上游提交模組轉換修補程式。不過,您必須遵循其他規範,才能提交 Android Common Kernel (ACK) 修補程式。
將受保護的 GKI 模組轉換為不受保護的模組
如果是 Android 15 以上版本,請將要從受保護轉換為不受保護的模組,新增至
common/modules.bzl
檔案中的COMMON_UNPROTECTED_MODULES_LIST
清單。如果是 Android 14,請從
common/android/gki_protected_modules
的受保護模組清單中,移除要從受保護轉換為不受保護的模組。如果是 Android 14 和 15,請更新受保護的匯出項目清單,排除
common/android/abi_gki_protected_exports_{ARCH}
中新轉換的不受保護模組,方法是使用aarch64
的tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
aarch64
。將變更送審。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 版本修正這個問題。