本页面介绍了如何构建 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
时,它还会执行 符号列表更新。