使用符號清單

為減少需要維護為穩定的符號和型別表面積,GKI 核心可將匯出的符號限制為模組所需的符號。如果是外部編譯的模組,您需要提供所用符號的清單,才能讓 GKI 核心匯出這些符號。舉例來說,模組用於 Cuttlefish 的符號會儲存在 gki/aarch64/symbols/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 或未指定,符號清單會根據參照符號的 Kernel 模組將符號分組。否則,符號清單就是所有核心模組使用的符號排序清單。

請參閱 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:gki/<arch>/symbols/<device>

請參閱以下範例: common-modules/virtual-device/BUILD.bazel

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

建立並提交初始符號清單

common/gki/<arch>/symbols/<device> 建立空白符號清單。以上述範例來說,指令如下:

touch common/gki/aarch64/symbols/virtual_device

將這個檔案新增至基本 GKI 核心建構的 additional_kmi_symbol_lists。舉例來說,//common:gki/aarch64/symbols/virtual_device 會新增至 aarch64_additional_kmi_symbol_lists 檔案群組,並在 common/BUILD.bazel 中宣告。

更新裝置符號清單,填入新的符號清單,然後傳送至 Android Common Kernel 存放區。

更新裝置符號清單

模組在 module_outskernel_buildkernel_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 Common Kernel Gerrit,讓新符號成為 KMI 的一部分。

提交訊息應包含新增或移除的符號清單。您可以手動編寫這份清單,更新一小部分的符號清單,也可以在更新參照 ABI 表示法後,使用 $DIST_DIR/abi_stgdiff/abi.report.short 報告。

雖然更新參考 ABI 表示法並非必要步驟,但這麼做可省去額外的預先提交步驟,加快提交變更的速度。無論如何,系統都會在預先提交期間檢查並視需要更新。

使用符號清單 (Android 13)

Android 13 支援 Kleaf 和舊版建構指令碼,因此您可以按照前幾節或下一節的說明管理符號清單。

使用符號清單 (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.aarch64ADDITIONAL_KMI_SYMBOL_LISTS 中。

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