一、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_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 构建系统核心变化 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