使用符號清單

為了減少需要維持穩定性的符號和類型,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 模組納入這份清單。

請將這些模組設為未簽署,否則符號清單可能會空白。如要這樣做,請在核心設定片段中加入這一行:

# 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