為減少需要維護為穩定的符號和型別表面積,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_outs
的 kernel_build
和 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 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.aarch64
的ADDITIONAL_KMI_SYMBOL_LISTS
中。