随着 Android 16 在 2025 年 6 月的发布,Google 对 Android Open Source Project(AOSP)的构建系统架构进行了一系列重大调整,这些变更不仅反映了 Android 平台向更模块化、硬件中立方向的演进,也对自定义 ROM 开发社区带来了深远的技术挑战。本文将从工程角度深入分析这些变更的技术细节、对开发流程的影响,以及可行的适配策略。
构建系统架构的演变:从 Make 到 Soong 再到 Bazel
Android 的构建系统经历了从传统 Make 系统到 Soong,再到逐步引入 Bazel 的演进过程。这一转型的核心目标是实现更好的模块化、更快的构建速度和更强的可扩展性。
传统 Make 系统作为 Android 最初的构建工具,虽然功能完整但存在构建速度慢、依赖关系管理复杂等问题。随着 Android 代码库的不断扩大,Make 系统的局限性日益明显。
Soong 构建系统的引入标志着 Android 构建架构的重要转折。Soong 使用 JSON-like 的.bp(Blueprint)文件来描述构建模块,这些文件采用声明式语法,相比 Makefile 更加简洁和易于维护。每个.bp文件定义了一个构建模块及其依赖关系,系统会自动解析这些文件并生成构建图。
// 示例:Android.bp文件结构
cc_binary {
name: "my_binary",
srcs: ["main.cpp"],
shared_libs: ["libutils"],
static_libs: ["libbase"],
}
Bazel 的逐步集成代表了构建系统演进的下一步。Google 在 2020 年宣布将 Bazel 引入 AOSP 生态系统,目标是利用 Bazel 的强大缓存机制和分布式构建能力来进一步提升构建效率。Bazel 的BUILD文件提供了更细粒度的依赖控制和更智能的增量构建。
2025 年关键变更:设备树移除与参考目标转移
Android 16 发布中最引人注目的变更是 Google 从 AOSP 中移除了 Pixel 设备的设备树(device trees)和驱动程序二进制文件。这一决策的背后是 Google 将 AOSP 参考目标从具体的 Pixel 硬件转向虚拟设备 "Cuttlefish" 的战略调整。
设备树的重要性不容忽视。设备树是构建 Android 系统镜像的关键组件,它包含了特定设备的硬件配置信息、外设定义、专有文件列表等详细信息。正如 Android Authority 报道中指出的,设备树是 "允许构建系统为特定设备构建适当镜像的配置文件的集合"。
Cuttlefish 作为新的参考目标代表了 Google 向硬件中立架构的转变。Cuttlefish 是一个运行在 PC 上的虚拟 Android 设备,允许开发者在没有实际硬件的情况下测试新功能。Google Android 平台副总裁 Seang Chau 解释称:"AOSP 需要一个灵活、可配置且经济实惠的参考目标 —— 独立于任何特定硬件,包括 Google 的硬件。"
内核提交历史的压缩是另一个重要变更。Pixel 设备的内核源代码提交历史被压缩为单个提交,这使得其他设备开发者难以从中提取功能、错误修复和安全补丁。此前,Pixel 的内核源代码常被用作其他设备的参考点。
工程影响分析:构建配置迁移的挑战
1. 设备树管理的复杂性增加
对于自定义 ROM 开发者而言,设备树的移除意味着他们不能再依赖 Google 提供的现成配置。以 LineageOS 项目为例,开发者现在需要:
- 基于 Android 15 的设备树反向工程 Android 16 的变更
- 从预构建的二进制文件中猜测必要的修改
- 每月重复这一过程以跟上安全更新
LineageOS 长期贡献者 Nolen Johnson 表示,为 Pixel 设备构建自定义 ROM 的过程现在变得 "痛苦"。开发者必须 "盲目猜测并从预构建 [二进制文件] 中反向工程每月需要哪些更改"。
2. 构建依赖关系的重新梳理
随着构建系统的模块化转型,依赖管理变得更加复杂。开发者需要:
- 重新映射模块间的依赖关系
- 处理
.bp文件与遗留 Makefile 的兼容性问题 - 适应 Bazel 构建规则的不同语义
3. 向后兼容性的维护成本
自定义 ROM 项目通常需要支持多个 Android 版本和设备型号。构建系统变更带来的挑战包括:
- 维护跨版本的构建配置
- 处理不同构建系统间的转换逻辑
- 确保旧设备仍能获得安全更新
技术适配策略与工程实践
1. 反向工程技术流程
面对设备树的缺失,开发者需要建立系统化的反向工程流程:
二进制差异分析:使用工具如bindiff或radare2分析不同版本二进制文件的差异,识别 API 变更和功能调整。
配置提取自动化:开发脚本从工厂镜像中提取设备配置信息,自动生成初始设备树框架。
变更追踪系统:建立每月变更追踪机制,记录从预构建二进制文件中识别出的修改,形成知识库。
2. 构建系统迁移的最佳实践
渐进式迁移策略:采用双构建系统并行的方式,逐步将模块从 Make 迁移到 Soong 或 Bazel。
模块化封装:将设备特定代码封装为独立的构建模块,减少对核心系统的依赖。
依赖图可视化:使用工具生成构建依赖图,帮助理解模块间关系,优化构建顺序。
3. 社区协作模式的调整
知识共享机制:建立设备树共享仓库,让开发者可以贡献和复用反向工程成果。
工具链标准化:推动社区采用统一的构建工具和配置模板,降低入门门槛。
测试基础设施:利用 Cuttlefish 虚拟设备建立自动化测试环境,减少对物理硬件的依赖。
具体技术参数与监控要点
构建性能监控指标
- 构建时间基线:建立不同配置下的构建时间基准,监控变更对构建速度的影响
- 内存使用峰值:跟踪构建过程中的内存使用情况,优化资源配置
- 缓存命中率:监控 Bazel 缓存的效率,调整缓存策略
设备树适配检查清单
- 内核配置提取完整性验证
- 设备节点映射正确性检查
- 专有二进制文件依赖关系梳理
- 电源管理配置适配
- 传感器驱动兼容性测试
向后兼容性保障措施
- 版本矩阵测试:建立 Android 版本与设备型号的测试矩阵
- API 兼容性检查:使用
veridex等工具检查 API 使用兼容性 - 构建配置验证:自动化验证构建配置在不同系统版本下的正确性
未来展望与建议
Android 构建系统的模块化转型是一个持续的过程。对于自定义 ROM 开发社区,建议采取以下策略:
技术债管理:定期评估和重构遗留的构建配置,避免技术债积累。
上游协作:积极参与 AOSP 社区,了解构建系统的发展方向,提前做好技术准备。
工具链投资:投资开发自动化工具,降低重复性工作的负担,提高开发效率。
多元化支持:不仅关注 Pixel 设备,也加强对其他厂商设备的支持,降低对单一参考平台的依赖。
结语
Android AOSP 构建系统的模块化转型代表了平台成熟和技术演进的必然趋势。虽然这些变更在短期内增加了自定义 ROM 开发的复杂性,但从长远来看,它们推动了更健壮、更可维护的构建架构的发展。通过采用系统化的工程方法和社区协作,开发者可以适应这些变化,继续为用户提供高质量的自定义 Android 体验。
正如 Google 所强调的,AOSP 并没有消失,而是在向更加开放和硬件中立的方向发展。对于开发者而言,这既是挑战,也是机遇 —— 一个重新思考构建流程、优化开发实践、推动技术创新的机会。
资料来源:
- Android Authority: "AOSP isn't dead, but Google just landed a huge blow to custom ROM developers" (2025-06-12)
- Ghacks: "Google's AOSP changes may make custom ROMs harder to build for Pixel devices" (2025-06-13)