如何使用符號列表

為了減少需要保持穩定的符號和類型的表面,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_buildmodule_outskernel_abikernel_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中。

  • 將符號清單更新傳送至 ACK