本頁說明如何將新的核心功能設為 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 檔案集,並依序排序,以便在執行階段進行二元搜尋,將模組指定為受保護的 GKI 模組。
common/android/gki_{ARCH}_protected_modules
使用tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
為aarch64
更新受保護的匯出清單,以便在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 檔案集,並依序排序,以便在執行階段進行二元搜尋,將模組指定為受保護的 GKI 模組。
common/android/gki_{ARCH}_protected_modules
使用tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
為aarch64
更新受保護的匯出清單,以便在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 模組的符號保護機制,在載入模組時可能會遇到兩種錯誤,導致失敗。
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
可能是該模組的未簽署自訂版本。當 module.ko
嘗試匯出 some_kernel_function
(只能由已簽署的 GKI 模組匯出) 時,載入作業會失敗,並顯示此訊息。
解決方法:
如果未簽署的模組為自訂版本,您可以使用匯出 some_kernel_function
的模組 GKI 版本來修正這個問題。