Gradle Client 和 Gradle Daemon 的 JDK
https://docs.gradle.org/current/userguide/gradle_daemon.html
Gradle 其实分为两个部分,可能使用到不同的 JDK,但绝大部分情况下是使用相同JDK。
- Gradle Client,也就是我们在terminal 中使用的 gradle cli。
- Gradle Daemon(Java Toolchain),真正负责构建和编译时用到的守护进程和工具链。
在命令行中执行 ./gradlew --version 可以看到相关信息(必须配置 JAVA_HOME):
------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------
Build time: 2025-02-25 09:22:14 UTC
Revision: 073314332697ba45c16c0a0ce1891fa6794179ff
Kotlin: 2.0.21
Groovy: 3.0.22
Ant: Apache Ant(TM) version 1.10.15 compiled on August 25 2024
Launcher JVM: 21.0.12.1 (Eclipse Adoptium 21.0.12.1+1-LTS)
Daemon JVM: C:\Program Files\Eclipse Adoptium\jdk-21.0.12.101-hotspot (no JDK specified, using current Java home)
OS: Windows 11 10.0 amd64
可以看到 Daemon JVM 里面有句话:no JDK specified, using current Java home。我们是可以通过项目根目录的 gradle.properties 单独配置 Daemon 所使用的 JVM 的,假设我们配置另一个 JDK 后再执行 ./gradlew --version
org.gradle.java.home=C:\\Users\\as\\.jdks\\semeru-17.0.9
------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------
Build time: 2025-02-25 09:22:14 UTC
Revision: 073314332697ba45c16c0a0ce1891fa6794179ff
Kotlin: 2.0.21
Groovy: 3.0.22
Ant: Apache Ant(TM) version 1.10.15 compiled on August 25 2024
Launcher JVM: 21.0.12.1 (Eclipse Adoptium 21.0.12.1+1-LTS)
Daemon JVM: C:\Users\as\.jdks\semeru-17.0.9 (from org.gradle.java.home)
OS: Windows 11 10.0 amd64
可以看到现在 Gradle Client(Launcher JVM) 使用 Eclipse Adoptium JDK 21,它是在 JAVA_HOME 中配置的。
而 Gradle Daemon 则使用 semeru-17.0.9 (IBM SEMERU OPENJ9) ,它是在 gradle.properties 中配置的,当构建或编译项目时它将使用这个 JDK。
但是一般情况下我们不会再 gradle.properties 中配置 JDK 路径,因为它指向的是本地,无法用于协作开发,后面会介绍 foojay,foojay 解决了协作开发时 jdk 版本的统一问题。
以上是在命令行中使用 Gradle 的场景,在 Android Studio 中则略有不同。
Android Studio 中配置的 JDK
默认情况下,Android Studio 中的 gradle 并不使用 JAVA_HOME 环境变量中配置的 JDK,而是使用Android Studio 内设置的 Gradle JDK,这个设置默认是 GRADLE_LOCAL_JAVA_HOME 变量(这个变量不是 Gradle 的而是 Android Studio 的,需要区分清楚),而这个变量值又默认指向 Android Studio 内置的 JBR (JetBrains Runtime),它本身用于运行 Android Studio,默认也用于 Gradle Client 和 Gradle Daemon,这个设置在 Android Studio 内运行 Gradle 时是最高优先级,覆盖 gradle.properties, foojay 等其它所有配置。

修改 Gradle JDK 可以改变运行 Gradle 和 Gradle Daemon 的 JDK(而Android Studio依然通过 JBR 运行,除非你设置STUDIO_JDK 环境变量,或者通过 Android Studio 的 Choose Boot Java Runtime 工具设置)
需要注意的是,这个设置不对 Android Studio 中的 Terminal 工具生效,Terminal 中依旧使用 JAVA_HOME 和 gradle.properties 中指定的 JDK。
这个设置生效的范围是 Android Studio 的操作按钮(Run,Debug,Build)和 Run Anything 执行的 Gradle 任务。
如果你的电脑内存比较吃紧,我建议 Gradle JDK 可以设置为 openj9 的派生 JDK,比如 IBM SEMERU,它能节省50%以上的内存,你甚至可以将 Android Studio 也设置为 openj9。
但可惜的是 openj9 不支持 kotlin KSP,因为 KSP 内置的 Kotlin Analysis API 会无条件初始化 jdk.jfr.EventType,而 OpenJ9 不支持这套完整的 JFR Java API。(Java Flight Recorder,一个低开> 销的诊断工具,用于收集 Java 运行时的详细信息,帮助分析性能瓶颈、内存泄漏等)
foojay toolchains
不同的安卓项目通常使用不同的 Gradle 版本,而不同 Gradle 版本也要求不同的 JDK 版本,从我们一开始接触 Android 开发时要求使用 JDK 8,到目前(Gradle 9.x)已经是 JDK 25。
现在你打开一个Android项目,Android Studio 可能出现以下提示:
Migrate to Gradle Deamon toolchain Projects using Daemon toolchain allow builds to automatically detect installed toolchains given the defined JVM criteria or download a compatible one if cannot be found locally. In addition, using the Daemon toolchain aligns the selection between CLI and IDE, avoiding spawning multiple Daemons improving performance but also makes it simple to handle the required toolchain on different machines.
它的作用有两个:
- 改变 Android Studio 的 Gradle JVM 配置页面,你不能再随意指定本地的 JDK,只能指定 foojay 支持的 JDK Version 和 Vendor。
- gradle 项目构建和编译时自动检测并下载对应的 JDK。

使用 foojay 后,会在当前项目的 gradle 目录下生成 gradle-daemon-jvm.properties 文件,里面记录了 JDK 的下载链接、版本和Vendor,这个文件需要提交到 git 仓库。
如果你还希望使用 openj9 以节省内存,可以选择 Vendor 为 IBM,IBM 提供的 JDK 是基于 openj9 的。 再次声明,openj9 不支持 Kotlin KSP 所需的 JFR 套件。