近期,Android官方团队宣布,Android Runtime (ART) 在编译时间上实现了 18% 的显著提升。此次优化的关键在于,在保证编译代码质量零损失、未增加峰值内存使用的前提下,实现了编译速度的大幅跃进,堪称一次“纯增益”的改进。
此项优化作为2025年的关键目标,已开始分阶段推送:部分改进已随2025年6月的 Android 系统更新 上线,其余将在年底的更新中完成。所有运行 Android 12 及以上版本的设备,均可通过 Project Mainline(Google Play系统更新)模块获得这些提升。
具体而言,此次优化的收益体现在:
- 编译时间减少18%
- 编译器输出代码质量无负面影响
- 无内存占用峰值回归
需要注意的是,这里的“编译速度”特指设备端 ART 对应用程序字节码进行 AOT(预先编译)或 JIT(即时编译)的速度,而非本地使用 Gradle 构建 APK 的速度。ART内部的编译器执行速度优化主要涉及 JIT 编译、AOT(dex2oat)编译以及各个中间表示(IR)与优化阶段(Pass)的执行时间。
官方在优化过程中发现,许多编译阶段存在不必要的开销。例如,全局值编号(GVN)阶段的一个 Kill 方法,会无条件遍历所有节点进行检查,而实际上多数检查结果可预知为false。通过跳过这些无效遍历,成功将该阶段的性能消耗从 1.023% 降至约 0.3%,并使 GVN 运行时间缩短约 15%。
FindReferenceInfoOf 的查找优化
在 LoadStoreAnalysis 阶段,方法 FindReferenceInfoOf 原本采用 O(n) 的线性搜索。优化后,数据结构改为以指令 ID 为索引的 O(1) 查找,并预分配向量以避免动态调整大小。此举使得该阶段速度提升 34-66%,整体编译时间获益 0.5-1.8%,且未增加峰值内存。
数据结构与生命周期适配
代码库中一个自定义的 HashSet 实现,最初为处理极少数大型集合而优化。然而,当前的实际使用模式是创建大量小型、短生命周期的集合。通过调整其实现以适应“小而短”的特征,减少了创建与销毁开销,编译时间因此提升 1.3-2%,内存使用量反而下降了 0.5-1%。
此外,通过将数据结构以引用而非值传递的方式传递给 lambda 表达式,避免了不必要的拷贝,将编译时间缩短了约 0.5% 到 1%。这一细微但重要的 代码优化技巧 在最初的代码审查中被忽略,并在代码库中保留了多年。
内联(Inlining)检查策略调整
编译器在进行函数内联时,原先的流程是先进行大量计算,最后才执行“最终检查”(如指令数、寄存器需求)来决定是否内联。优化后,将这些检查提前至计算前作为启发式规则,避免了大量无效计算。仅指令数检查这一项的顺序调整,就带来了约 2% 的编译速度提升。
优化之路并非一帆风顺。团队在尝试改进时遇到了典型挑战:
- 内存回归:在优化“输出写入”阶段时,尝试通过缓存计算值来加速(预计提升1.3-2.8%),但自动化测试发现额外的缓存数据结构导致了内存使用量显著增加。
- 历史遗留负担:许多低效代码因历史原因遗留,或因代码审查疏忽(如误用值传递替代引用传递)而存在。
- 复杂度权衡:某些优化方案可能过于复杂,或会增加长期的代码维护难度。
为解决这些问题,团队采取了以下策略:
- 针对性重构:针对“输出写入”阶段的内存回归问题,团队重构了该阶段逻辑,移除了一个冗余数据结构,不仅解决了内存问题,还额外获得了 0.5-1.8% 的速度提升。
- 深度性能剖析:利用
pprof 等 性能剖析工具 生成火焰图(Flame Graph)和自底向上(Bottom-up)视图,精准定位如频繁调用的 Kill 方法或意外对象拷贝等“隐形”开销。
- 原型快速验证:采用“快速迭代”策略,先构建原型在典型应用上验证想法,确认收益后再进行完整的工程实现与测试,以节省开发时间。
- 利用现代C++特性:例如,使用
BitVectorView 替代可变长的 BitVector,并利用模板化实现在64位平台上让 Union() 操作一次处理两倍数据位。
其他众多细粒度优化同样贡献了累积收益,例如:通过簿记(Add bookkeeping)缩短编译时间约0.6-1.6%;延迟计算(Lazily compute data)以避免循环计算;重构代码以跳过无用预计算;优化循环结构以便编译器更好地优化等。
总结
对于广大 Android 用户和开发者而言,此次 ART 编译器的深层优化意味着更流畅的设备体验。具体将体现在:
- 应用启动速度更快
- 冷启动时的卡顿减少
- 对低端设备更加友好
- 应用安装与更新过程提速
此次优化不仅是单纯的速度竞赛,更是一次教科书级别的工程实践,平衡了速度、内存、稳定性与可维护性等多重指标。Android 官方的这份报告,不仅是一份技术公告,更堪称一份关于编译器与运行时优化的优秀案例研究。
参考链接:
|