如何运行 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 和 build 工件的目标位置,您可以使用 --dist_dir 选项:

tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist

分析 build 与参考表示法之间的 ABI 差异

在上述命令中执行的 //common:kernel_aarch64_abi_dist 目标会分析并报告位于 common/android/abi_gki_aarch64.stg 的 build 与参考表示法(在 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 表示法。如果没有参考 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 监控和设备目标

只需要为核心内核 build 目标配置 ABI 监控。直接使用 GKI 内核编译的混合 build 配置(定义 base_kernel 的配置)只需支持跟踪设备符号列表。 ABI 定义应该使用 GKI build 进行更新。

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

旧版内核

Android 13

除了 ABI 格式为 XML 且参考 ABI 表示为 common/android/abi_gki_aarch64.xml 之外,构建说明与 Android 14 大体相同。

Android 12 及更低版本

与 Android 13 一样,ABI 格式为 XML。

较旧的内核使用 build.sh 而不是 Kleaf。对于 ABI 监控,您应使用 build_abi.sh,它接受与 build.sh 相同的环境变量自定义 build。例如:

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