AGP 演进与版本升级总览

说实话,做 Android 构建优化这些年,我最大的感触就是:AGP 版本升级从来不是简单改个数字的事。每跳一个大版本,Gradle 的构建行为、任务编排、缓存策略都会跟着变。你要是没搞清楚这些变化背后的逻辑,光看瀑布图找瓶颈,很容易被表象带偏。

1.1 AGP 发展简史:从 1.0 到 8.x 我经历了什么

AGP 最开始就是个打包脚本。我记得 2013 年刚接触 Android Studio 时,AGP 还是 0.x 版,连 MultiDex 都要靠手动配。后来到了 AGP 2.x,才开始有像样的构建变体(Build Variant)概念。真正让构建效率有质的飞跃,是 AGP 3.0 之后引入了增量编译——说白了,就是只编译你改过的文件,不用每次都全量重编。

嗯,这里有个坑我要提下:AGP 3.0 的增量编译默认是开启的,但如果你用了自定义 Task 且没有正确声明输入输出,增量就无效。我曾经被一个混淆配置搞崩溃过——每次改一行代码,构建却要 40 秒,瀑布图分析后才发现是自定义 Task 偷懒用了 @OutputDirectory 指向整个 build 目录。

AGP 版本Gradle 最低要求关键变化(构建相关)我的评价
1.0 – 2.x2.x基本打包,无增量慢到怀疑人生
3.0 – 3.64.x – 5.x引入增量编译、D8、R8终于能用了
4.0 – 4.26.x – 7.x启用 Java 11、构建缓存优化稳定,我项目里用得最多
7.0 – 7.47.x – 8.xConfiguration Cache、非传递式 R 类坑也不少,但值得升
8.0 – 8.x8.x+Kotlin 1.9+、并行任务增强当前主力,速度提升明显

核心观点:AGP 每次大版本升级,基本上都在做三件事——提高编译效率、减少冗余任务、增强缓存命中率。理解了这三条主线,你才能看懂瀑布图里那些陡峭的柱子到底怎么回事。

1.2 主流版本升级路线图

你可能会问:这么多版本,我该走哪条路线?其实主流就两条:

  • 稳妥派:逐个大版本升,比如 4.2 → 7.4 → 8.2,每步停留一个月观察回归。
  • 激进派:直接跳到最新稳定版,然后用 AGP Upgrade Assistant 一键迁移。

我个人习惯是走稳妥路线。为什么?因为 AGP 7.0 开始引入了 Configuration Cache,这东西一旦触发 SerializationException,整个项目的构建都会炸。我记得有一次升级到 7.2 后,只要改了 build.gradle 里的一个 ext 属性,配置阶段就会报错,排查了一整天才发现是某个三方插件没适配新缓存格式。

避坑指南:我曾经在 AGP 7.0 升级时,直接跳过了 4.2 的所有小版本,结果开发机上的 Gradle Daemon 频繁 OOM。后来查文档才发现,AGP 7.0 对 Gradle 堆内存的默认分配策略变了,需要手动设 -Xmx4096m。所以升级时一定要看官方的 Migrations Guide。

1.3 大版本升级对构建速度的潜在影响

说白了,每个大版本升级都会改变构建任务的执行顺序、并行度以及缓存策略。我总结了三类最明显的影响:

  1. 增量编译效果波动:AGP 3.x 到 4.x 增量编译变得激进,但如果你用了 databinding,它反而会拖慢第一次编译。因为 databinding 的注解处理器会在增量模式下重新生成所有绑定类。
  2. Resource shrinker 性能变化:AGP 4.0 之后,资源缩减(shrinkResources)默认使用 AAPT2 的 --no-version-vectors 参数,但如果你项目中用了大量 vector 图片,这步反而变慢。
  3. Configuration Cache 的双刃剑:AGP 7.0+ 的 Configuration Cache 能让你第二次及以后的构建快 30%~50%,但第一次开启时会额外花时间去序列化配置。而且如果插件不兼容,缓存会无限失效,导致每次都是全量构建。

警告:不要以为升级后瀑布图一定会变平。我曾见过一个项目从 AGP 4.2 升到 7.4 后,:app:mergeDebugNativeLibs 这个 task 执行时间反而从 2 秒暴增到 12 秒。原因就是新版本把 CMake 任务的输出粒度改成了按架构分,导致 I/O 压力增大。所以每次升级后,必须拿 build scan 或 profile.json 跑一遍对比。

1.4 AGP 演进与构建性能影响关系图

下面这张图梳理了 AGP 各版本的关键变化与构建性能的对应关系。节点颜色越深,代表那个版本对构建速度的冲击越大。

AGP 版本演进与构建性能影响图谱 AGP 1.x 基本打包 AGP 3.x 增量编译+ D8 AGP 4.x R8 + 缓存优化 AGP 7.x Configuration Cache AGP 8.x 并行任务 + 新DSL 编译效率 • 增量编译开启/关闭 • D8/R8 压缩与混淆 • Java / Kotlin 编译速度 • 注解处理器影响 缓存与重复任务 • 构建缓存命中率 • Configuration Cache 序列化 • 自定义 Task 输入输出声明 • 资源 / 资源缩减缓存 并行策略 • 并行任务数量上限 • Worker API 多线程 • 按变体组合执行 • 依赖解析并行化 最终目标:用瀑布图定位瓶颈 对比升级前后 build scan 中的 Task 耗时、缓存命中、配置阶段时长

从这张图你能看出,每个 AGP 版本其实都在往编译效率、缓存、并行这三个方向走。但具体到你的项目,哪个方向对构建速度提升最大?这就需要后续章节里提到的瀑布图诊断法了。

1.5 小结:升级前必须做的准备

打算升级 AGP 版本?我建议你先做这三件事:

  • 跑一次完整的 build scan,记录当前各个阶段耗时(配置、任务、解析)。
  • 检查项目依赖的三方插件是否声明了支持的 AGP 版本范围。我见过很多升级卡死在 Kotlin 插件版本不兼容上。
  • 准备好回滚方案——用 Git 单独拉一个升级分支,把 build.gradle 和 gradle-wrapper.properties 都锁住。

说白了,AGP 版本升级就像一场手术:不做不行,但动了刀子就可能出并发症。只有把术前检查(瀑布图)做好了,你才知道该切哪块。