為了減少需要維持穩定性的符號和類型,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_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
。