You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:50:57