為了減少需要保持穩定的符號和類型的表面,GKI 內核具有將導出符號限制為僅模組所需的符號的功能。對於外部編譯的模組,您需要有一個已使用符號的列表,以允許 GKI 核心導出它們。例如, Cuttlefish模組使用的符號儲存在android/abi_gki_aarch64_virtual_device
中。
新增符號清單產生的目標
符號列表由kernel_abi
目標產生。使用下列選項將此目標新增至裝置BUILD.bazel
:
name
應採用
<kernel_build>_abi
格式。kernel_build
應包含設備
kernel_build
目標的名稱。
您也可以使用以下選項:
kernel_modules
樹外模組的目標清單。樹內模組不應包含在此。請參閱準備樹內模組以進行符號擷取。
kmi_symbol_list_add_only
此選項可防止刪除未使用的符號。僅允許在 KMI穩定期間的特定時間刪除符號,一旦 KMI凍結則不允許刪除符號。
當您對多個不同裝置使用相同的符號清單時,這也很有用。這樣,它不會刪除設備 A 使用的符號,但不會刪除設備 B 使用的符號。
module_grouping
如果為
True
或未指定,則符號清單將根據引用該符號的核心模組對符號進行分組。否則,符號列表將只是所有內核模組使用的符號的排序列表。
例如,請參閱common-modules/virtual-device/BUILD.bazel :
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [
":virtual_device_aarch64_external_modules",
],
kmi_symbol_list_add_only = True,
)
另請參閱 Kleaf 中有關kernel_abi
目標的參考文件。
準備樹內模組以進行符號提取
若要準備用於符號擷取的樹內模組,請在kernel_build
目標的module_outs
屬性中列出供應商特定的樹內模組。有關範例,請參閱_VIRT_COMMON_MODULES
及其用法。不要在此列表中包含 GKI 模組。
將這些模組配置為unsigned ,否則符號清單可能為空。為此,請將此行新增至您的內核配置片段:
# CONFIG_MODULE_SIG_ALL is not set
例如,請參閱common-modules/virtual-device/virtual_device_core.fragment 。
將設備符號清單新增至設備內核建置中
將屬性kmi_symbol_list
加入到裝置BUILD.bazel
中定義的kernel_build
目標。符號清單的名稱應採用//common:android/abi_gki_<arch>_<device>
格式。請參閱common-modules/virtual-device/BUILD.bazel ,例如:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
建立並提交初始交易品種列表
在common/android/abi_gki_<arch>_<device>
處建立一個空符號清單。對於上面的範例,命令為:
touch common/android/abi_gki_aarch64_virtual_device
將此檔案新增至基礎 GKI 核心版本的additional_kmi_symbol_lists
。例如, //common:android/abi_gki_aarch64_virtual_device
新增到aarch64_additional_kmi_symbol_lists
檔案群組(在common/BUILD.bazel中聲明)。
更新裝置符號清單以填入新的符號清單並將其傳送至 Android 通用核心儲存庫。
更新設備符號列表
kernel_build
的module_outs
和kernel_abi
的kernel_modules
中的模組所使用的所有核心核心符號都應包含在符號列表中。這可以透過執行帶有_update_symbol_list
後綴的kernel_abi
目標來完成。例如,以下指令更新//common-modules/virtual-device:virtual_device_aarch64
的符號清單:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
傳送符號清單更新至 ACK
將包含符號清單變更的補丁傳送至Android 通用核心gerrit,以使新符號成為 KMI 的一部分。
提交訊息應包含新增或刪除的符號的清單。您可以手動編寫此清單以進行小型符號清單更新,也可以在更新參考 ABI 表示後使用$DIST_DIR/abi.report.short
報表。
雖然不需要在發送符號清單更新之前更新參考 ABI 表示,但它可以消除額外的預提交步驟,並使更改準備好提交更快。無論如何,在預提交期間如有必要,都會進行檢查和更新。
舊版(Android 12 及更低版本)
使用build_abi.sh
工具如下:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
在此範例中, build.config.device
必須包含下列設定選項:
vmlinux
必須是
FILES
清單的一部分。這可以透過包含build.config.aarch64
來完成。KMI_SYMBOL_LIST
必須設定並指向 KMI 符號清單才能更新。
更新裝置符號清單後,您還需要在 GKI 版本 ( common/build.config.gki.aarch64
) 中反映這些變更:
將更新後的符號清單複製到
common/android/abi_gki_aarch64_<device>
。檢查
android/abi_gki_aarch64_<device>
是否包含在common/build.config.gki.aarch64
ADDITIONAL_KMI_SYMBOL_LISTS
中。