AGP 版本演进:从 3.x 到 8.x 的变与不变

如果你做过几年 Android 构建,一定被 AGP 版本折腾过。说实话,AGP 的版本跨度非常大,从 3.x 到 8.x,每次升级都像是一次“大考”。我自己就经历过几次迁移翻车,后来才慢慢摸清规律。这一节,咱们就捋一捋每个版本到底改了啥、哪些特性值得你记住。

AGP 版本演进路线图 (3.x → 8.x) AGP 3.x 2017-2018 Gradle 4.x/5.x Java8+, 注解处理器 AGP 4.x 2019-2020 AndroidX, Maven R8 全量, AAPT2 AGP 5.x 2021 Dexing 优化 Android 12 支持 AGP 6.x 2021-2022 增量构建优化 JDK 11+ 支持 AGP 7.x 2022-2023 Kotlin 深度集成 Gradle 7+ AGP 8.x 2023+ 强制 R8, 移除旧选项 Gradle 8+, 编译性能飞跃 注意:8.x 与 7.x 有破坏性变更

3.x 时代:奠基

AGP 3.0 是 Android 构建工具链的一个分水岭。为什么这么说?从 3.0 开始,Gradle Plugin 强制要求使用 Gradle 4.x 以上,并且引入了 Java8+ 支持 —— 你可以在 Android 中愉快地使用 Lambda 和 Stream 了。我个人记得,当时为了把项目从 2.x 迁移到 3.x,光解决依赖冲突就花了两天。不过,从那以后构建速度确实快了不少。

提示:AGP 3.x 开始,annotation processor 不再需要手动声明在 apt 工具里,直接配置 annotationProcessor 即可。

4.x 时代:转型

AGP 4.x 最大的标志是 强制使用 AndroidX。那时我正在做一个大型电商 APP,support 库的依赖多到爆炸。迁移到 AndroidX 简直是一场噩梦,但长期来看,这为后来的 Jetpack 生态铺平了路。另外,4.x 也默认开启 R8 替代 ProGuard,并且原生支持 AAPT2。你想想看,之前用 AAPT 编译,遇到资源文件重复就得手工排除,AAPT2 直接解决了这个问题。

5.x 与 6.x:稳扎稳打

这两个版本其实是迭代优化期。5.x 重点改进了 Dexing 性能,尤其是多模块项目,增量编译终于不像以前那么慢。而 6.x 则把 JDK 11 作为推荐编译环境。我曾经在升级到 6.x 时忽略了这个配置,结果编译报了一大堆 “Unsupported class file major version”,后来发现只是 JDK 版本没跟上。

// AGP 6.x 推荐 gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
// 同时项目 JDK 必须 >= 11

7.x:新起点

AGP 7.x 最低要求 Gradle 7.x,这意味着你不能再偷懒用老版本的 wrapper 了。这个版本最让我印象深刻的是 Kotlin 构建脚本的完整支持 —— 你可以用 .gradle.kts 写全量配置,还能和 Java Plugin 无缝混用。另外,Android Test Coverage 的生成机制也改了,如果你之前用 Jacoco 手动配置,现在可以直接用官方 API。

关键变更:AGP 7.0 移除了 variantFilter 的 String 参数,改用 VariantFilter 对象。迁移时记得更新 Gradle Script。

8.x:未来已来

到了 8.x,AGP 变得更加激进。它 移除了大量旧版兼容性 API,比如默认关闭 Jack、禁用旧的 Dx 编译,强制使用 D8/R8。还有一个坑——AndroidManifest 合并行为变了,如果你的项目中有多个 module 定义了同样的 activity,8.x 会直接报错。我曾经在升级时遇到一个 app 无法安装,查了半天才发现是一个第三方库的 manifest 里多写了一个未注册 activity。

警告:AGP 8.x 不再支持 Gradle 6.x 以下版本,请确保你的 CI 环境升级到 Gradle 8.x 以上。

关键版本速览表

AGP 版本最低 Gradle核心变化我的评价
3.x4.4+Java8+, 注解处理器分离奠基之作,迁移成本高
4.x5.1+AndroidX, R8 默认, AAPT2最伤筋动骨的一次升级
5.x6.1+Dexing 优化, AAPT2 增强构建效率明显提升
6.x7.0+增量构建, JDK 11 支持稳定过渡,几乎无坑
7.x7.3+Kotlin DSL 全支持, 测试覆盖优化值得升级,但注意 VariantFilter
8.x8.0+强制 R8, 移除旧 API, 性能飞跃最新最强,但有破坏性变更

说白了,每个版本都藏着一些“暗雷”。我的建议是:不要盲目追新,也别死守旧版。先读 release note,再看自己的 CI 环境是否兼容,最后在小项目中验证。嗯,这样折腾下来,基本不会翻车。