一、AGP基础:什么是AGP、AGP版本演进与选择、AGP与Gradle的关系
咱们做 Android 开发的,每天都跟 Gradle 和 AGP 打交道。但说实话,很多人用了好几年,对 AGP 到底是什么、它跟 Gradle 怎么配合、版本该怎么选,还是模模糊糊的。我刚开始带团队的时候,就因为在 AGP 版本上踩了坑,导致整个项目构建时间从 3 分钟暴涨到 15 分钟,编译出来的包体积还莫名其妙大了 20%。嗯,从那以后我就特别重视 AGP 配置了。
这一章,咱们就把 AGP 的老底翻一翻。你搞清楚这三个问题,后面优化包体积才有根基。
1.1 什么是 AGP
AGP 的全称是 Android Gradle Plugin,说白了就是一个 Gradle 插件。它的工作,就是把 Gradle 这个通用的构建工具,跟 Android 的编译、打包、签名、资源处理这些特定流程连接起来。
你看,Gradle 本身不认识 .apk、.aab,也不知道什么是资源 ID 混淆、什么是 multi-dex。这些“Android 专属”的事情,全得靠 AGP 来完成。我习惯这么理解:Gradle 是骨架,AGP 是血肉,两者合在一起,才能跑出一个完整的 Android 构建流程。
AGP 的核心职责包括:
- 解析
build.gradle中的 android 配置(如 compileSdk、buildTypes、productFlavors) - 将 Java / Kotlin 源码编译为 .class,再转换为 DEX
- 处理 Android 资源(res、assets、manifest)
- 执行混淆(ProGuard / R8)、分包、签名、对齐
- 生成 APK 或 AAB 产物
举个例子,你在 build.gradle 里写了 minifyEnabled true,Gradle 本身根本不懂这是什么意思。是 AGP 把这个配置翻译成对 R8 的调用,再调度 Gradle 的 Task 去执行。我早期做过一个项目,升级 AGP 后忘了同步 R8 规则,结果包体积虽然小了,但运行时疯狂崩溃——那就是 AGP 版本升级导致默认混淆行为变了。
1.2 AGP 版本演进与选择
AGP 从 1.0 走到现在,变化非常大。我整理了一个对照表,你一眼就能看清版本脉络。
| AGP 版本 | 对应 Gradle 最低版本 | 核心变化 |
|---|---|---|
| 3.0.x | 4.1 | 引入 Java 8 脱糖、variant API 简化 |
| 3.6.x | 5.6.4 | 新增 ViewBinding、构建缓存重写 |
| 4.0.x | 6.1.1 | R8 默认开启、Java 8+ API 脱糖增强 |
| 4.2.x | 6.7.1 | 修复大量构建缓存问题,优化增量编译 |
| 7.0.x | 7.0 | AGP 包名改为 com.android.tools.build:gradle:7.0.0,支持 JDK 11 |
| 7.4.x | 7.5 | 默认启用非传递 R 类,压缩包体积的利器 |
| 8.0.x | 8.0 | 彻底移除 Jack,最小 SDK 版本要求提升至 24 |
| 8.5.x | 8.5 | 引入非 SDk API 限制检查、性能大幅提高 |
现实选择建议:
- 新项目:直接上 AGP 8.x + Gradle 8.x,拥抱最新特性
- 老旧项目:别盲目追新。先评估第三方库兼容性,再考虑要不要升级。我曾经把一个 AGP 3.6 的项目硬升到 7.0,结果引用的一个老版本华为 HMS SDK 直接报编译错误,回退了两天才搞定
- 如果你特别关注包体积,我建议优先考虑 AGP 7.4+,因为非传递 R 类能直接砍掉几百 KB 甚至几 MB
1.3 AGP 与 Gradle 的关系
这个问题其实很简单,但很多人没转过弯来。我用一张图来彻底讲清楚:
你看这张图就明白了:Gradle 是构建引擎,它负责调度任务的执行顺序、管理依赖缓存、并行执行等底层工作。AGP 是构建指令集,它告诉 Gradle 需要执行哪些 Android 特定的任务(比如用 aapt2 打包资源、用 R8 做混淆)。而 Android SDK 提供了那些任务需要的命令行工具。
换句话说,Gradle 并不直接调用 aapt2,而是通过 AGP 的 Task 来间接调用。我早期犯过一个错误:手动改了 Gradle 的 maxParallelForks 配置,结果 AGP 的某些 Task 因为线程安全问题直接报错。这就是因为我不理解 AGP 与 Gradle 的协作边界。
说得再直白点:Gradle 是操作系统,AGP 是驱动程序。你得先装好操作系统(Gradle),再装对应的驱动(AGP),驱动才能正确操作硬件(SDK 工具)。
嗯,这一章的基础概念就这么多。后面咱们再聊具体怎么通过 AGP 配置来压缩包体积——那才是真正实用的硬功夫。