NixOS下Flutter构建APK遇Gradle JDK8探测失败问题求助
构建Flutter APK时Gradle JDK版本指定问题
问题现象
执行flutter build apk构建APK时,Gradle抛出JDK 8探测失败错误,日志如下:
FAILURE: Build failed with an exception.
- What went wrong:
Could not determine the dependencies of task ':unifiedpush_android:compileDebugKotlin'.Provisioned toolchain '$HOME/.gradle/jdks/adoptium-8-x64-hotspot-linux/jdk8u432-b06' could not be probed.
注:该JDK文件夹存在且所有用户均有读取权限。
已尝试的无效操作
修改android/app/build.gradle配置Java编译兼容性为17,但问题未解决:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } ... }
当前环境配置(flake.nix)
{ description = "Flutter environment"; inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:NixOS/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: let pkgs = import nixpkgs { inherit system; config.allowUnfree = true; config.permittedInsecurePackages = [ "olm-3.2.16" ]; }; androidEnv = pkgs.androidenv.override { licenseAccepted = true; }; androidComposition = androidEnv.composeAndroidPackages { buildToolsVersions = [ "30.0.3" ]; platformVersions = [ "31" "32" "33" "34" ]; cmakeVersions = [ "3.18.1" ]; includeNDK = true; ndkVersion = "23.1.7779620"; useGoogleAPIs = true; extraLicenses = [ "android-googletv-license" "android-sdk-arm-dbt-license" "android-sdk-license" "android-sdk-preview-license" "google-gdk-license" "intel-android-extra-license" "intel-android-sysimage-license" "mips-android-sysimage-license" ]; }; androidSdk = androidComposition.androidsdk; in { devShell = with pkgs; mkShell rec { ANDROID_HOME = "${androidSdk}/libexec/android-sdk"; ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk"; CHROME_EXECUTABLE = "google-chrome-stable"; JAVA_HOME = jdk17.home; FLUTTER_ROOT = flutter324; DART_ROOT = "${flutter324}/bin/cache/dart-sdk"; GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/30.0.3/aapt2"; QT_QPA_PLATFORM = "wayland;xcb"; buildInputs = [ androidSdk android-tools android-udev-rules flutter324 gradle jdk17 ]; shellHook = '' if [ -z "$PUB_CACHE" ]; then export PATH="$PATH:$HOME/.pub-cache/bin" else export PATH="$PATH:$PUB_CACHE/bin" fi flutter doctor -v ''; }; } ); }
解决方案
1. 通过Gradle属性强制指定JDK版本
在项目根目录的gradle.properties文件中添加配置,直接指定JDK 17路径:
org.gradle.java.home=${JAVA_HOME}
(利用你flake中已配置的JAVA_HOME环境变量,无需硬编码路径)
2. 修改项目根目录build.gradle配置
在android/build.gradle中配置Gradle工具链版本:
plugins { id "com.android.application" version "7.4.2" apply false id "com.android.library" version "7.4.2" apply false // 保留原有其他插件配置 } // 添加工具链指定 java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }
3. 命令行临时指定
构建时直接通过命令行传递参数:
flutter build apk -Dorg.gradle.java.home=$JAVA_HOME
4. 清理Gradle工具链缓存
检查项目中是否存在gradle/toolchains/toolchain.xml文件,若存在则删除该文件,避免它强制指定JDK 8。
关键说明
你之前修改的compileOptions仅控制Java代码的编译兼容性版本,而Gradle自身运行所依赖的JDK版本需要通过上述方式单独指定,二者是独立的配置项。
内容的提问来源于stack exchange,提问作者McFly
相关产品推荐
相关产品推荐

