一、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 的构建流程,说白了就是三步:

  1. 编译依赖:先把 native 库、Java 库都编译好
  2. 打包:把所有东西塞进一个 .apex 文件
  3. 签名:用平台密钥签名,确保系统信任

你想想看,以前更新一个系统服务,得等整车 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_availableproduct_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 改进了 ccachesccache 的支持。现在编译缓存命中率更高了。我建议你把缓存目录放到 SSD 上,效果更明显。

我的配置:

export CCACHE_DIR=/mnt/ssd/ccache
export CCACHE_SIZE=50G
export USE_CCACHE=1

这样配置后,第二次编译基本秒开。

五、知识体系总览

下面这张图,是我自己整理的 Android 12 构建系统核心变化。你可以把它当作学习路线图。

Android 12 构建系统核心变化 APEX 模块编译 构建系统重构 性能优化 独立更新 Android.bp 定义 签名机制 版本管理 Soong 全面接管 Android.bp 语法 自动依赖解析 模块化设计 增量编译 RBE 远程编译 ccache 优化 编译缓存 目标:更快编译、更易维护、更安全更新 Android 12 构建系统三大核心变化及其子特性 三者相互配合,共同提升构建效率

六、实战建议

如果你正准备升级到 Android 12 的构建系统,我有几点建议:

  • 先做小范围测试:别一上来就把整个项目迁移。选一个模块试试水。
  • 备份旧的 Android.mk:万一迁移出问题,还能回退。
  • 关注官方文档:Google 的 soong_docs 写得挺详细,值得一看。
  • 利用社区资源:我在 AOSP 的 issue tracker 上找到过不少有用的讨论。

最后说一句:Android 12 的构建系统变化,短期看是学习成本,长期看是生产力提升。我当年从 Make 迁移到 Soong,花了大概两周时间适应。但适应之后,效率提升是实打实的。你值得投入这个时间。


公众号:蓝海资料掘金营,微信deep3321