如何在 Android Studio 中控制 Java 和 Gradle 版本?
结论
构建失败的原因是 Java 23 与项目使用的 Gradle 运行时不兼容。报错中的 Unsupported class file major version 67 对应 Java 23。
排查时需要区分以下三个版本:
flutter doctor --verbose中的C:\Program Files\Java\jdk-23\bin\java:Flutter 调用 Gradle 时使用的 Java。settings.gradle中的com.android.application version "8.1.0":Android Gradle Plugin(AGP)版本,不是 Gradle 版本。android/gradle/wrapper/gradle-wrapper.properties中的distributionUrl:项目实际使用的 Gradle 版本。
这个项目建议让 Flutter 和 Android Studio 统一使用 JDK 17。如果必须使用 Java 23,需要把 Gradle 升级到支持 Java 23 的版本,并确认 AGP、Kotlin 插件和当前 Flutter 版本同样兼容。只修改其中一个版本号可能会引发其他问题。
为什么会出现这个错误
flutter doctor --verbose 显示:
Java binary at: C:\Program Files\Java\jdk-23\bin\java
Java version Java(TM) SE Runtime Environment (build 23.0.1+11-39)
这说明通过 Flutter 命令行构建时,Gradle 进程使用的是 Java 23。
Android Studio 一栏显示的是 Java 21:
Java version OpenJDK Runtime Environment (build 21.0.3...)
这里通常指 Android Studio 自带或运行时使用的 JetBrains Runtime,并不代表 Flutter 命令行构建也在使用 Java 21。
下面这段配置:
id "com.android.application" version "8.1.0" apply false
指定的是 AGP 8.1.0。Gradle 版本需要在以下文件中查看:
android/gradle/wrapper/gradle-wrapper.properties
例如:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
这行配置表示项目使用 Gradle 8.3。
推荐方案:统一使用 JDK 17
AGP 8.1.0 以 JDK 17 作为运行基线。对于已有的 Flutter 项目,改用 JDK 17 通常比升级整套 Android 构建工具风险更低。
安装 JDK 17 后执行:
flutter config --jdk-dir="C:\Program Files\Java\jdk-17"
请把路径替换成实际安装目录,然后检查配置:
flutter doctor --verbose
输出中的 Java binary at 应指向 JDK 17,例如:
Java binary at: C:\Program Files\Java\jdk-17\bin\java
Java version ... 17...
接着进入项目重新构建:
flutter clean
flutter pub get
flutter run
如果旧的 Gradle 守护进程仍在运行,可以先将其停止:
cd android
.\gradlew.bat --stop
cd ..
flutter run
在 Android Studio 中设置 Gradle JDK
Android Studio 发起 Gradle 同步和构建时使用的 JDK,可以在以下位置设置:
File
> Settings
> Build, Execution, Deployment
> Build Tools
> Gradle
> Gradle JDK
在 Gradle JDK 中选择已经安装的 JDK 17。
这项设置主要影响 Android Studio 发起的 Gradle 操作。通过终端运行 flutter run 时,还需要使用 flutter config --jdk-dir 指定 Flutter 使用的 JDK。两处使用同一个 JDK,可以避免 IDE 和命令行的构建结果不一致。
如果设置页面中没有 Gradle 选项,可以在 Android Studio 里单独打开 Flutter 项目的 android 子目录,等 Gradle 项目加载完成后再查看。
在项目中固定 Gradle 使用的 Java
如需在项目级别指定 Java,可以在 android/gradle.properties 中加入:
org.gradle.java.home=C:/Program Files/Java/jdk-17
Windows 路径建议使用正斜杠,以免遇到反斜杠转义问题。
这项配置会把本机路径写入项目文件。如果项目由多人协作并提交到版本控制,不建议提交包含个人安装路径的 org.gradle.java.home。每位开发者可以分别配置 Android Studio 的 Gradle JDK,或者运行:
flutter config --jdk-dir="C:\Program Files\Java\jdk-17"
也可以把系统级 JAVA_HOME 指向 JDK 17:
JAVA_HOME=C:\Program Files\Java\jdk-17
不过,系统中的其他工具可能依赖不同的 Java 版本。使用 Flutter 专用的 flutter config --jdk-dir,通常更方便控制影响范围。
如何控制项目的 Gradle 版本
项目的 Gradle 版本由以下文件控制:
android/gradle/wrapper/gradle-wrapper.properties
例如:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
要确认 Gradle 版本及其实际使用的 Java,可以在项目目录中执行:
cd android
.\gradlew.bat --version
查看以下内容:
Gradle ...
Launcher JVM: ...
Daemon JVM: ...
这些信息反映了该项目的 Gradle Wrapper 启动时所用的环境,比单独运行 java -version 更准确。
如果必须保留 Java 23
Gradle 从 8.10 开始支持以 Java 23 作为运行 JVM。可以把 Wrapper 改为兼容版本,例如:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
如果项目仍使用 AGP 8.1.0,不建议只修改这一项。Gradle、AGP、Kotlin Gradle Plugin 和 Flutter 工具链都有各自的版本兼容要求。即使 Gradle 可以在 Java 23 上运行,旧版 AGP 或 Flutter Gradle 插件仍可能报错。
确实需要升级时,可以按以下顺序处理:
- 根据当前 Flutter 版本创建一个临时新项目。
- 对比新旧项目的 AGP、Kotlin 和 Gradle Wrapper 配置。
- 检查这些版本对 Java 23 的兼容要求。
- 配套升级构建配置,避免只改
distributionUrl。 - 运行
.\gradlew.bat --version和flutter build apk验证结果。
如果没有必须使用 Java 23 的依赖,直接改用 JDK 17 会更简单。
为什么重装 Android Studio 没有解决
当前 Flutter 使用的是:
C:\Program Files\Java\jdk-23\bin\java
这个路径可能来自 Flutter 配置、JAVA_HOME、系统 PATH 或项目中的 org.gradle.java.home。重装 Android Studio 不会自动清除这些配置,所以 Flutter 仍可能继续调用原来的 JDK 23。
可以运行以下命令,查看 Flutter 是否保存过 JDK 路径:
flutter config --list
同时检查:
echo $env:JAVA_HOME
where.exe java
最后分别验证 Flutter 和 Gradle 使用的 Java:
flutter doctor --verbose
cd android
.\gradlew.bat --version
两处都显示预期的 JDK 后,Flutter 和 Gradle 的 Java 环境才算统一。
备注:内容仅供参考。
