本頁說明如何建構 Android 核心 ABI 呈現方式,以及執行 ABI 監控。適用於 Android 16 以上版本。如為較低版本,請參閱「ABI monitor previous kernel versions」。
另請參閱 Kleaf 的參考說明文件:支援 ABI 監控 (GKI) 和支援 ABI 監控 (裝置)。
建構核心及其 ABI 表示法
下載 GKI 來源後,請執行下列指令來建構 GKI 核心和 ABI 構件:
tools/bazel run //common:kernel_aarch64_abi_dist這項指令會建構目前的 ABI 呈現方式,並連同建構的 Kernel 和模組一併複製到 $DIST_DIR/abi.stg。$DIST_DIR
預設為 out_abi/kernel_aarch64_abi_dist/dist。
您可以在指令結尾的 -- 後方,為 ABI 工具指定額外引數。舉例來說,如要變更 ABI 和建構構件的目的地,可以使用 --destdir 選項:
tools/bazel run //common:kernel_aarch64_abi_dist -- --destdir=out/dist分析建構版本與參考表示法之間的 ABI 差異
前一個指令執行的 //common:kernel_aarch64_abi_dist 目標會分析並回報建構作業和 common/gki/aarch64/abi.stg (定義於 BUILD.bazel) 參考表示法之間的所有 ABI 差異。這些差異會在建構作業結束時列印出來,如下例所示:
INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!
列印的報表來自 $DIST_DIR/abi_stgdiff/abi.report.short 的建構構件,以及其他格式的報表。
自動化作業應使用建構指令的結束代碼,如果發現差異,該代碼會是非零值。
請注意,開發階段的分支 (包括 android-mainline) 沒有參考 ABI 表示法。否則 //common:kernel_aarch64_abi_dist 不會偵測到任何差異。
更新參考 ABI 表示法
凡是會影響核心 ABI 的變更 (例如符號清單更新),都必須反映在參考 ABI 表示法 (common/gki/aarch64/abi.stg,定義於 BUILD.bazel) 中。如要執行這項操作,請執行下列指令:
tools/bazel run //common:kernel_aarch64_abi_update這個指令會執行「分析 ABI 差異」步驟中的所有作業,並更新來源中的參照表示法。接著,您可以在與變更相同的提交中上傳更新後的 ABI。在提交訊息中加入 $DIST_DIR/abi_stgdiff/abi.report.short 報告中的 ABI 差異。
ABI 監控和裝置目標
ABI 監控只需要為核心核心建構目標設定。混合式建構設定 (定義 base_kernel 的設定) 直接使用 GKI 核心編譯時,只需要新增追蹤裝置符號清單的支援功能。ABI 定義應使用 GKI 建構作業更新。
另請參閱 Kleaf 的參考說明文件: 支援 ABI 監控 (裝置)。
監控先前的 ABI 核心版本 (Android 15 以下版本)
如果是舊版核心,ABI 建構和監控的操作說明如下。
Android 15 和 14
操作說明與 Android 16 大致相同,但參照 ABI 表示法為 common/android/abi_gki_aarch64.stg 和 $DIST_DIR,預設為 out_abi/kernel_aarch64/dist。
Android 13
Android 13 可使用 Kleaf 或舊版建構指令碼建構。
對於 Kleaf,操作說明與 Android 14 相同,但 ABI 格式為 XML,且參考 ABI 表示法為 common/android/abi_gki_aarch64.xml。
如果是舊版建構指令碼,操作說明與 Android 12 相同。
Android 12 以下版本
ABI 格式為 XML,參考 ABI 表示法為
common/android/abi_gki_aarch64.xml
這些核心會使用 build.sh,而非 Kleaf。如要監控 ABI,請使用 build_abi.sh,這個指令會接受與 build.sh 相同的環境變數,以自訂建構作業。例如:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh這會建構核心,並將 ABI 表示法擷取至 OUT_DIR (預設為 out_abi) 子目錄,相當於 Kleaf 的 //common:kernel_aarch64_abi_dist 目標 (請參閱「建構核心和 ABI 構件」)。
參照 ABI 表示法會儲存在 android/abi_gki_aarch64.xml 中,如 common/build.config.gki.aarch64 中的 ABI_DEFINITION 變數所定義。
如要更新核心 ABI 表示法,最方便的方法是使用 --update 和 --print-report 選項:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report--print-report 會列印檔案現有 ABI 與新產生 ABI 之間的差異。
--update 選項會覆寫參考 ABI 表示法。此外,如果使用 BUILD_CONFIG 搭配已設定 KMI_SYMBOL_LIST 的裝置,也會更新符號清單。