在github上下载的项目后尝试本地运行,新进公司拉取git项目尝试本地运行,甚至在以前正常编译的项目中导入三方的aar包尝试编译时,有时会遇到奇奇怪怪的提示
比如
Execution failed for task ':app:desugarDebugFileDependencies'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.DexFileDependenciesTask$DexFileDependenciesWorkerAction
> Error while dexing.
或者
Unsupported desugared library configuration version, please upgrade the D8/R8 compiler
再或者
java.lang.NullPointerException: Cannot invoke "String.length()" because "<parameter1>" is null
越是这种看着奇怪的编译错误信息,就越要考虑是不是AGP、Gradle、JDK 三者的版本不匹配导致的了
这里不匹配包含两种情况:
- 项目自身的AGP、Gradle、JDK 三者的版本不匹配,编译报错
- 项目自身的AGP、Gradle、JDK版本匹配可以正常编译,但是导入aar包后编译报错
1 怎么看版本
既然怀疑是AGP、Gradle、JDK 三者的版本不匹配,肯定得先明确我们项目配置的AGP、Gradle、JDK版本信息
1.1 查看AGP版本
AGP是 Android Gradle Plugin的缩写,意思是Android Gradle 插件。那么它的版本信息在哪定义的呢?其实就在我们项目的根目录下就可以看到
一般我们项目的根目录如下(这里仅展开呈现了我们关系的部分目录)
|-app(dir)
|-build(dir)
|-libs(dir)
|-src(dir)
|-main(dir)
|-build.gradle
|-...
|-bulld(dir)
|-gradle(dir)
|-wrapper
|-gradle-wrapper.jar
|-gradle-wrapper.properties
|-builde.gradle
|-gradle.properties
|-settings.gradle
|-...
打开根目录下的builde.gradle文件,找到plugins包起来的部分

这里的com.android.application和com.android.library后面跟的version就是AGP版本号信息,比如上面截图里声明的是7.2.1,这里两个版本号应该保持一致,否则可能又会有奇奇怪怪的问题。
如果你打开看到的是这种

也不要惊慌,按住键盘ctrl,左键点击暗红色部分跳转到定义文件中,也可看到同样定义的是com.android.application和com.android.library版本信息

在Android Studio中,我们还可以有更快捷的方式找到AGP版本定义文件:切换到Android视角(下面截图左上角的下拉箭头可以切换不同视角),展开Gradle Scripts后第一个gradle文件就是(studio给我们在后面直接标注了项目名称的那个就是,比如这里的vhdroomsManager)

1.2 查看Gradle版本
回顾下我们项目的根目录结构,找到gradle目录并展开到孙节点
|-app(dir)
|-build(dir)
|-libs(dir)
|-src(dir)
|-main(dir)
|-build.gradle
|-...
|-bulld(dir)
|-gradle(dir)
|-wrapper
|-gradle-wrapper.jar
|-gradle-wrapper.properties
|-builde.gradle
|-gradle.properties
|-settings.gradle
|-...
可以看到gradle-wrapper.properties文件,我们打开它,通常是这样的

这里distributionUrl就是配置下载路径,同时也可以看到版本信息
比如
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip代表从https://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip下载7.3.3版本的Gradle
当然这里还有一个关键步骤,我们要让studio启用gradle-wrapper.properties配置的版本

点击studio工具类File,在展开的菜单中选择Settings

然后按照如上截图的123步骤操作
这里的第3步选择Wrapper很重要,它决定了我们是否使用gradle-wrapper.properties中配置的版本,为什么是Wrapper,我们回头看下,gradle-wrapper.properties的上级目录名称是什么?刚好就叫“wrapper”
如果你想使用你本地已经下载好的gradle文件,就可以选择Local installation然后在后面输入框附上本地gradle文件目录地址

1.3 查看JDK版本
在1.2章节中我们已经提到jdk版本查看方法了

截图里第4步就是选择jdk版本的地方

从列表里选择你要使用的jdk版本就可以了
如果你下载了某个jdk版本,但是这个列表里找不到,点击"Add JDK from disk..."选择你本地存放jdk的目录即可
2 各自的作用
我们已经知道了如何查看AGP、Gradle、JDK的版本信息,那么它们各自到底有什么作用呢
2.1 Android Gradle 插件(AGP)作用
核心作用:连接 Gradle 和 Android 的「专属翻译 / 执行者」
- Gradle 是通用工具,不懂 Android 特有的规则(比如编译 Kotlin/Java 成 Dex、处理资源文件、签名 APK),AGP 就是为 Gradle 量身定做的「Android 模块」。
- 你可以把它理解成:工厂总管(Gradle)手下的「Android 生产线主管」,把总管的通用指令翻译成 Android 能执行的具体操作。
- 具体做什么:实现 Android 特有的构建逻辑(如 desugar 处理、资源打包、Dex 编译)、提供 compileSdk/minSdk 等 Android 专属配置项。
2.2 Gradle 构建工具的作用
核心作用:项目构建的「总指挥」
- 本质是一个通用的自动化构建工具(不止用于 Android),负责定义「构建流程」(比如编译代码、打包、生成安装包)。
- 你可以把它理解成:一个能按你写的「脚本(build.gradle)」自动完成「原料→成品」全流程的工厂总管。
- 具体做什么:管理依赖下载、按顺序执行编译 / 打包任务、输出 APK/AAB 等产物。
2.3 JDK(Java Development Kit)的作用
核心作用:构建过程的「底层运行环境 + 编译器」
- 是所有 Java/Kotlin 代码编译、Gradle/AGP 运行的「基础工具包」—— 没有 JDK,Gradle 和 AGP 都启动不了,代码也无法编译。
- 你可以把它理解成:工厂的「电力 + 基础工具」,没有它,总管和生产线主管都没法干活。
- 具体做什么:提供 Java 编译器(javac)编译代码、提供 JVM 运行 Gradle/AGP 程序、提供基础类库支持。
2.4 小结
- JDK:底层基础,负责代码编译和运行环境,是「地基」;
- Gradle:通用构建总管,负责统筹整个构建流程,是「总调度」;
- AGP:Android 专属插件,负责把 Gradle 指令转换成 Android 具体操作,是「Android 专属执行者」。
三者的关系:JDK 支撑 Gradle/AGP 运行 → Gradle 调用 AGP → AGP 执行 Android 项目的具体构建任务。
3 版本对应关系
在第2章中可以看出,它们三者是有依赖关系的
当某些大的特性更新后,就会出现无法相互兼容老版本的问题,所以我们在使用的时候必须要匹配好它们之间的版本关系,否则就会有各种奇怪的异常
通常编译的时候Studio就直接报错,但是大部分时候编译器不会直接提示是因为版本不匹配导致的,就比如文章开头列举的部分错误信息,它们都没有明确说是因为这三者版本不匹配导致
这里整理一份表格做参考
| Android Gradle 插件 (AGP) 版本 | 最低 Gradle 版本 | 推荐 Gradle 版本 | 支持的JDK 版本 | 备注 |
|---|---|---|---|---|
| 7.0.x | 7.0 | 7.0 - 7.2 | JDK 11 | 适配 compileSdk 30+ |
| 7.1.x | 7.2 | 7.2 - 7.3 | JDK 11 | 优化 desugar 兼容性 |
| 7.2.x | 7.3 | 7.3 - 7.4 | JDK 11 | 支持 Android 12L |
| 7.3.x | 7.4 | 7.4 - 7.5 | JDK 11 | 适配 compileSdk 33 |
| 7.4.x | 7.5 | 7.5 - 7.6 | JDK 11 | 最后支持 Java 8 编译 |
| 8.0.x | 8.0 | 8.0 - 8.1 | JDK 11 (推荐) / JDK 17 | 强制要求 Java 11+ 编译 |
| 8.1.x | 8.1 | 8.1 - 8.2 | JDK 11 / JDK 17 | 适配 Android 14 |
| 8.2.x | 8.2 | 8.2 - 8.3 | JDK 11 / JDK 17 | 优化 D8/R8 性能 |
| 8.3.x | 8.3 | 8.3 - 8.4 | JDK 17 (推荐) / JDK 11 | 优先推荐 JDK 17 |
| 8.4.x | 8.4 | 8.4 | JDK 17 | 仅支持 JDK 17 |
关键补充说明
JDK 版本注意:
- AGP 7.0+ 开始不再支持 JDK 8,最低要求 JDK 11
- AGP 8.4+ 彻底移除 JDK 11 支持,仅支持 JDK 17
- 项目编译代码的 sourceCompatibility/targetCompatibility 可以设置为 1.8(Java 8),但构建工具本身需要用 JDK 11/17
版本选择原则:
- 优先选 AGP 稳定版(如 8.2.0、7.4.2),避免选 x.x.0 初始版本(可能有坑)
- 不要跨大版本混用(如 AGP 8.0 配 Gradle 7.5),必出兼容性问题
4 回归问题
开头提到的的两个问题
- 项目自身的AGP、Gradle、JDK 三者的版本不匹配
- 项目自身的AGP、Gradle、JDK版本匹配可以正常编译,但是导入aar包后编译失败
问题1,就按照第3章中版本对应关系进行匹配修改就可以
问题2,当导入aar包,出现奇怪的编译错误时,就可以跟aar提供方沟通下AGP、Gradle、JDK 三者的版本信息,尽量保持一致。如果无法确定aar包版本信息,按照表格尝试使用较新的AGP、Gradle、JDK版本。