Gradle运行时JDK由org.gradle.java.home配置决定,优先级高于JAVA_HOME;执行./gradlew --version可查看Launcher JVM和Daemon JVM版本,二者需一致才可靠。

Gradle 运行时用的 JDK 是哪个?
就是启动 ./gradlew 这个命令时,底层 JVM 的版本。它不看项目里写了什么 sourceCompatibility,只看系统怎么调起 Gradle 进程。
最稳的判断方式是执行:./gradlew --version,看输出里 Launcher JVM 和 Daemon JVM 后面的版本号——这两个必须一致才可靠。
真正控制它的,只有 org.gradle.java.home 这个配置项,写在项目根目录的 gradle.properties 里:
org.gradle.java.home=/path/to/jdk-17
注意:File → Project Structure → SDK Location 里改的 JDK 只影响 IDE 自身(比如代码高亮、跳转),对 Gradle 构建完全无效;ANDROID_HOME 或 JAVA_HOME 环境变量也只在没设 org.gradle.java.home 时才兜底生效,且容易被终端/IDE 启动方式干扰(比如 Android Studio 终端右键 Run 命令会绕过 JAVA_HOME)。
编译 Java/Kotlin 源码用的 JDK 是哪个?
不是 org.gradle.java.home,也不是 IDE 设置的 SDK,而是 java.toolchain.languageVersion(Kotlin DSL)或 java { toolchain { languageVersion = ... } }(Groovy DSL)指定的版本。
这个配置决定:javac 和 kotlinc 实际调用哪个 JDK 的编译器,以及单元测试、Javadoc 用的 JVM 版本。
常见误区:
- 没显式配置
toolchain时,它默认 fallback 到org.gradle.java.home指向的 JDK —— 但一旦你配了,就以它为准 -
android.compileOptions.sourceCompatibility只是“语法开关”,不决定编译器本身;它和toolchain不一致时会报错,比如sourceCompatibility = VERSION_21但toolchain指向 JDK 17,直接提示error: release version 21 not supported
为什么两个 JDK 必须分开管?
Gradle 本身是 Java 程序,它需要一个“能跑起来”的 JDK(比如 AGP 8.4 要求 Gradle ≥ 8.6,而 Gradle 8.6 最低需 JDK 17);但你的 App 代码可能得兼容 Android 5.0(即字节码要降到 Java 8),这时就得让编译器生成旧版 class 文件。
典型安全组合:
-
org.gradle.java.home指向 JDK 17(满足 Gradle + AGP 运行要求) -
java.toolchain.languageVersion = JavaLanguageVersion.of(17)(保证编译器支持 record、sealed 等特性) -
android.compileOptions.sourceCompatibility = JavaVersion.VERSION_17(允许你写 JDK 17 语法) -
android.compileOptions.targetCompatibility = JavaVersion.VERSION_17(生成 JDK 17 字节码,运行时需至少 JDK 17)
如果目标设备是老 Android,targetCompatibility 得降级(如 VERSION_1_8),但前三个仍可保持为 17 —— 编译器用新 JDK,产出旧字节码,这是完全合法的。
最容易被忽略的坑
改完 gradle.properties 里的 org.gradle.java.home,不执行 ./gradlew --stop,旧的 Gradle daemon 还在用错的 JDK 跑着,构建行为不会立刻变化。
Android Studio 内置终端右键 Run 命令,走的是 IDE 自己的 JDK 配置(Settings → Build Tools → Gradle → Gradle JDK),和 gradle.properties 无关;而你在系统终端里敲 ./gradlew build,才真正受 org.gradle.java.home 控制 —— 同一个项目,在不同入口触发构建,可能用完全不同的 JDK。











