AGP、Gradle、JDK 三者的版本对应关系

在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 三者的版本不匹配导致的了
这里不匹配包含两种情况:

  1. 项目自身的AGP、Gradle、JDK 三者的版本不匹配,编译报错
  2. 项目自身的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包起来的部分

image.png

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

如果你打开看到的是这种


image.png

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


image.png

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


image.png

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文件,我们打开它,通常是这样的

image.png

这里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配置的版本


image.png

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


image.png

然后按照如上截图的123步骤操作

这里的第3步选择Wrapper很重要,它决定了我们是否使用gradle-wrapper.properties中配置的版本,为什么是Wrapper,我们回头看下,gradle-wrapper.properties的上级目录名称是什么?刚好就叫“wrapper”

如果你想使用你本地已经下载好的gradle文件,就可以选择Local installation然后在后面输入框附上本地gradle文件目录地址


image.png

1.3 查看JDK版本

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


image.png

截图里第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 小结

  1. JDK:底层基础,负责代码编译和运行环境,是「地基」;
  2. Gradle:通用构建总管,负责统筹整个构建流程,是「总调度」;
  3. 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 回归问题

开头提到的的两个问题

  1. 项目自身的AGP、Gradle、JDK 三者的版本不匹配
  2. 项目自身的AGP、Gradle、JDK版本匹配可以正常编译,但是导入aar包后编译失败

问题1,就按照第3章中版本对应关系进行匹配修改就可以
问题2,当导入aar包,出现奇怪的编译错误时,就可以跟aar提供方沟通下AGP、Gradle、JDK 三者的版本信息,尽量保持一致。如果无法确定aar包版本信息,按照表格尝试使用较新的AGP、Gradle、JDK版本。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容