谷歌宣布将 AutoFDO 引入 Android 内核,通过真实执行数据提升系统性能

点点百科 百科资讯 1

3 月 11 日消息,Android 开发者团队今日发布博客,详细介绍了将自动反馈导向优化(AutoFDO)技术引入 Android 内核的最新进展。

据介绍,这项优化旨在通过对内核代码进行针对性调优,为用户带来更流畅的系统体验。

什么是 AutoFDO?

在常规软件编译过程中,编译器基于静态代码提示做出成千上万个小决策,例如是否内联函数、条件分支的哪一路更可能被执行。虽然这些启发式规则很有用,但它们未必能准确反映设备在真实使用环境中的运行情况。

AutoFDO 技术通过引入真实世界的执行模式来指导编译器优化。这些执行模式记录了代码在实际使用中最常见的指令执行路径,通过采集 CPU 的分支历史信息获得。

对于内核代码,谷歌团队在实验室环境中使用代表性负载(如 Top100 的热门应用)来合成这些数据。采样分析器会捕获数据,识别出代码中的“热”(频繁使用)和“冷”(极少使用)区域。当使用这些配置文件重新构建内核时,编译器可以针对实际 Android 工作负载做出更智能的优化决策。

真实的性能提升

通过利用实验室环境的配置文件,谷歌团队在多项关键指标上获得了明显性能提升。这些配置文件通过应用爬取和启动采集,并在搭载 6.1、6.6 和 6.12 内核的 Pixel 设备上进行了测量。

谷歌官方指出,这些优化在实际使用中可以转化为更流畅的界面、更快的应用切换速度、更长的电池续航以及更敏捷的设备响应。考虑到内核占用约 40% 的 CPU 时间,这一优化带来的收益相当可观。

此前,AutoFDO 已被用于优化 Android 用户空间中的原生可执行文件和库,并带来了约 4% 的冷启动应用启动速度提升以及约 1% 的系统启动时间缩短。

技术实现流程

AutoFDO 的部署涉及一套精密的流程,以确保配置文件的时效性和性能的稳定性。

第一步:配置文件采集

与用户空间二进制文件依赖内部测试设备采集不同,内核的通用内核映像(GKI)采用受控的实验室环境进行配置。这样做可以将性能优化与设备发布周期解耦,实现灵活的即时更新。测试证实,实验室数据带来的性能提升与真实环境相当。

具体做法是:在测试设备上刷入最新内核映像,使用 simpleperf 工具捕获指令执行流。这一过程依赖硬件能力记录分支历史,在 Pixel 设备上利用的是 ARM 嵌入式跟踪扩展(ETE)和 ARM 跟踪缓冲区扩展(TRBE)。工作负载方面,团队使用 Android 应用兼容性测试套件(C-Suite)中排名前 100 的热门应用构建代表性负载,重点关注应用启动、AI 驱动的应用爬取以及系统级监控。验证结果显示,这种合成工作负载与内部设备采集的执行模式相似度高达 85%。

第二步:配置文件处理

原始跟踪数据需要经过后处理才能转化为编译器可用的格式。团队会将多次测试运行和多个设备的数据聚合为单一系统视图,将原始跟踪转换为 AutoFDO 配置文件格式,并根据需要过滤掉不需要的符号。此外,配置文件中会移除“冷”函数的数据,让这些函数使用标准优化方式,以避免罕见代码出现性能退化或二进制体积不必要增大。

第三步:配置文件测试

部署前,配置文件需要经过严格验证,确保能带来一致性的性能提升且没有稳定性风险。团队会严格对比新配置文件的内容(包括热点函数、样本计数和配置文件大小)与之前版本,并使用配置文件构建新内核映像,分析二进制文件以确保代码段的变化符合预期。同时,团队会在新内核映像上运行有针对性的基准测试,确认其能保持由先前基线确立的性能改进。

持续更新与稳定性保障

由于代码会随着开发持续变化,静态的配置文件自然会慢慢失效。为了维持其峰值性能,Android 团队计划持续更新优化数据。目前,团队正在 android16-6.12 和 android15-6.6 分支中刷新配置文件,未来将扩展支持更新的 GKI 版本,如即将推出的 android17-6.18。

对于稳定性方面的顾虑,谷歌团队解释称,AutoFDO 主要影响编译器启发式规则(如函数内联和代码布局),而非改变源代码逻辑,因此不会影响内核的功能完整性。

这项技术已经在 Android 平台库、ChromeOS 以及谷歌内部服务器基础设施中规模化应用多年,证明了其可靠性。团队还采用“默认保守”策略,对于未在配置文件中捕获的“冷”函数,仍使用标准编译器方法进行优化,确保极端情况下的行为与标准构建完全一致。

展望未来

除了当前在 android16-6.12 和 android15-6.6 分支的部署,谷歌团队还规划了多项技术演进方向:将 AutoFDO 配置文件部署到更新的 GKI 内核版本和更多构建目标;将优化范围从主内核二进制文件(vmlinux)扩展到 GKI 模块,惠及更大范围的内核子系统;支持使用驱动开发套件(DDK)构建的供应商模块,允许供应商将其特定硬件驱动纳入优化;以及从更广泛的关键用户旅程(CUJ)采集配置文件,扩大优化覆盖面。