运行 ABI 监控

本页面介绍了如何构建 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 的配置)只需添加对跟踪设备符号列表的支持。ABI 定义使用 GKI 构建进行更新。

另请参阅 Kleaf 的参考文档:支持 ABI 监控(设备)

旧版内核

Android 13

构建说明与 Android 14 大致相同,只是 ABI 格式为 XML,参考 ABI 表示为 common/android/abi_gki_aarch64.xml

Android 13 及更低版本

与 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 时,它还会执行 符号列表更新