一、Android 12 构建系统:不只是升级,是重构
Android 12 的构建系统变化,说实话,是我这几年见过最大的一次。不是小修小补,而是动了根基。我当年从 Android 7 开始接触构建系统,一路看到现在,每次大版本都有新花样。但 Android 12 这次,嗯,值得你花时间好好理解。
为什么这么说?因为 Google 终于对 apex 模块下了狠手,把构建系统也翻了个底朝天。说白了,就是让 Android 更好维护、更快编译、更安全地更新系统组件。
核心变化三件事:
- APEX 模块编译:系统组件可以独立更新了
- 构建系统重构:Soong 和 Make 的恩怨终于了结
- 性能优化:编译速度提升 30% 以上
二、APEX 模块:系统组件的「集装箱」
2.1 什么是 APEX?
APEX 的全称是 Android Pony EXpress。名字挺萌,但功能很硬核。它允许你把系统组件打包成独立模块,像安装普通 App 一样更新系统服务。
我刚开始接触这个概念时,第一反应是:「这不就是 APK 吗?」其实不完全一样。APEX 是给系统组件用的,权限更高,更新后不需要完整 OTA。
2.2 APEX 的编译方式
在 Android 12 里,编译 APEX 模块变得规范多了。以前你得写一堆 Makefile,现在用 Android.bp 就能搞定。
// 一个典型的 APEX 模块定义
apex {
name: "com.android.myfeature",
manifest: "apex_manifest.json",
key: "com.android.myfeature.key",
// 依赖的 native 库
native_shared_libs: [
"libmyfeature_jni",
"libmyfeature_core",
],
// 依赖的 Java 库
java_libs: [
"myfeature-service",
],
// 是否可更新
updatable: true,
}
这里有个坑,我踩过。就是 apex_manifest.json 里的版本号必须和 Android.bp 里的一致,否则编译直接报错。我曾经因为这个排查了半天,最后发现是手抖写错了版本号。
我的习惯:每次新建 APEX 模块,先写 manifest 文件,再写 Android.bp。顺序对了,少踩坑。
2.3 APEX 的构建流程
APEX 的构建流程,说白了就是三步:
- 编译依赖:先把 native 库、Java 库都编译好
- 打包:把所有东西塞进一个 .apex 文件
- 签名:用平台密钥签名,确保系统信任
你想想看,以前更新一个系统服务,得等整车 OTA。现在只要推送一个 APEX 文件,重启服务就行。这对厂商来说,简直是救命稻草。
三、构建系统重构:Soong 全面接管
3.1 Make 时代的终结
Android 构建系统,最早是纯 Makefile。后来 Google 搞了 Soong,用 Go 语言重写了一套构建工具。Android 12 之前,两者还能共存。到了 Android 12,Make 基本被抛弃了。
我记得有个同事,做了五年 Android 构建,一直用 Make。Android 12 出来后,他不得不学 Soong。一开始他很不适应,觉得 Make 挺好的。但用了一个月后,他说:「真香。」
3.2 Soong 的核心优势
| 特性 | Make | Soong |
|---|---|---|
| 配置文件 | Android.mk | Android.bp |
| 语法 | Shell 风格 | JSON 风格 |
| 依赖解析 | 手动 | 自动 |
| 增量编译 | 一般 | 优秀 |
| 模块化 | 弱 | 强 |
说白了,Soong 就是让构建系统更「现代」了。你不需要再写那些复杂的变量展开、条件判断。一个 Android.bp 文件,清晰明了。
3.3 迁移注意事项
如果你还在用 Android.mk,建议尽快迁移。Android 12 虽然还兼容 Make,但后续版本可能直接砍掉。
我曾经踩过的坑:迁移时,LOCAL_MODULE_TAGS 在 Soong 里变成了 vendor_available 和 product_available。直接复制粘贴会报错。一定要对照官方文档逐个检查。
四、性能优化:编译速度翻倍
4.1 增量编译优化
Android 12 的构建系统,在增量编译上下了大功夫。以前改一行代码,可能要等 5 分钟重新编译。现在,Soong 能精确识别哪些模块需要重编,哪些可以跳过。
我自己的项目,从 Android 11 升级到 12 后,增量编译时间从平均 4 分钟降到了 1 分半。这感觉,就像从绿皮火车换成了高铁。
4.2 RBE(远程构建执行)
Android 12 正式支持了 RBE。说白了,就是把编译任务分发到多台机器上并行执行。如果你的团队有服务器集群,这个功能能让你爽到飞起。
# 启用 RBE 编译
export USE_RBE=true
export RBE_service=your.rbe.service:443
m -j32
注意,RBE 需要网络环境稳定。我曾经在办公室用 Wi-Fi 跑 RBE,结果网络波动导致编译失败。后来换了有线网络,再也没出过问题。
4.3 编译缓存优化
Android 12 改进了 ccache 和 sccache 的支持。现在编译缓存命中率更高了。我建议你把缓存目录放到 SSD 上,效果更明显。
我的配置:
export CCACHE_DIR=/mnt/ssd/ccache
export CCACHE_SIZE=50G
export USE_CCACHE=1
这样配置后,第二次编译基本秒开。
五、知识体系总览
下面这张图,是我自己整理的 Android 12 构建系统核心变化。你可以把它当作学习路线图。
六、实战建议
如果你正准备升级到 Android 12 的构建系统,我有几点建议:
- 先做小范围测试:别一上来就把整个项目迁移。选一个模块试试水。
- 备份旧的 Android.mk:万一迁移出问题,还能回退。
- 关注官方文档:Google 的
soong_docs写得挺详细,值得一看。 - 利用社区资源:我在 AOSP 的 issue tracker 上找到过不少有用的讨论。
最后说一句:Android 12 的构建系统变化,短期看是学习成本,长期看是生产力提升。我当年从 Make 迁移到 Soong,花了大概两周时间适应。但适应之后,效率提升是实打实的。你值得投入这个时间。
公众号:蓝海资料掘金营,微信deep3321