本页面介绍了如何构建 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 13 及更低版本
与 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
时,执行符号列表更新。