本節介紹如何建立 Android 核心 ABI 表示並執行 ABI 監控。適用於Android 14以上版本。對於舊版本,請參閱舊核心版本。
另請參閱 Kleaf 的參考文件:支援 ABI 監控 (GKI)和支援 ABI 監控 (設備) 。
建構核心及其 ABI 表示
下載 GKI 原始碼後,執行下列命令來建立 GKI 核心和 ABI 工件:
tools/bazel run //common:kernel_aarch64_abi_dist
此命令建立目前的 ABI 表示並將其與建置的核心和模組一起複製到out_abi/kernel_aarch64/dist/abi.stg
。
您可以在命令末尾的--
之後指定 ABI 工具的額外參數。例如,要變更 ABI 和建置工件的目標,您可以使用--dist_dir
選項:
tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist
分析建構和參考表示之間的 ABI 差異
在上面的命令中執行的//common:kernel_aarch64_abi_dist
目標會分析並報告位於common/android/abi_gki_aarch64.stg
(在BUILD.bazel中定義)的建構和參考表示之間發現的任何 ABI 差異。這些差異將在建置結束時列印出來,如下列範例所示:
INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!
列印的報表來自位於out_abi/kernel_aarch64/dist/abi_stgdiff/abi.report.short
建置工件以及其他格式的報表。
自動化應該使用建置命令的退出程式碼,如果發現差異,則該退出程式碼將非零。
請注意,開發階段分支(包括android-mainline
)沒有參考 ABI 表示。如果沒有它, //common:kernel_aarch64_abi_dist
將不會偵測到任何差異。
更新參考 ABI 表示
影響核心 ABI 的任何變更(例如符號清單更新)都需要反映在參考 ABI 表示形式中( common/android/abi_gki_aarch64.stg
,在BUILD.bazel中定義)。為此,您需要執行以下命令:
tools/bazel run //common:kernel_aarch64_abi_update
此指令執行分析 ABI 差異步驟中的所有內容,並另外更新來源中的參考表示。然後可以在與更改相同的提交中上傳更新的 ABI。請在提交訊息中包含與$DIST_DIR/abi.report.short
中報告的 ABI 差異。
ABI 監控和設備目標
只需要為核心核心建立目標配置 ABI 監控。直接使用 GKI 核心編譯的混合建置配置(定義base_kernel
)只需要新增對追蹤設備符號清單的支援。應使用 GKI 版本更新 ABI 定義。
另請參閱 Kleaf 的參考文件:支援 ABI 監控(設備) 。
較舊的核心版本
安卓13
建構指令與 Android 14 基本相同,只是 ABI 格式為 XML 並且參考 ABI 表示形式為common/android/abi_gki_aarch64.xml
。
Android 12 及更低版本
與 Android 13 中一樣,ABI 格式為 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 表示。當對配置了KMI_SYMBOL_LIST
的裝置使用BUILD_CONFIG
時,它也會更新符號清單。