
原问题与场景JDK 11 加载不了 61.0 字节码Flutter Android 环境链断在哪这篇记录的是 Flutter Android 环境链排障本地 JDK 11Gradle 8.14Android SDK 36NDK r28c结果在 Gradle 配置阶段报Unsupported class file major version 61。为了让“把报错贴给 Cursor 就能定位”这条路先稳定我把 Cursor 的模型请求接到了 TaoToken官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。TaoToken 在这里只负责给 Cursor 提供 Key 和 OpenAI 兼容 Base URL装 JDK、改镜像、跑 aria2c 仍然在终端完成。问题的本质并不复杂但排查时很容易被 Flutter 的依赖链绕进去。Android 侧不是单独一个 JDK 版本问题而是一串版本互相咬合Flutter 调用 Gradle 8.14Gradle 又需要合适的 JDKAndroid SDK 36 的命令行工具由 Java 17 编译NDK r28c 还会被 ML Kit 这类原生依赖拉下来。只要其中一环版本错位就会在看似无关的位置报错。我本地装的是 JDK 11执行 Flutter Android 构建时Gradle 配置阶段直接抛出字节码版本不兼容。61.0 对应 Java 17JDK 11 只能识别到 55.0所以它加载不了用 Java 17 编译的官方命令行工具。这个报错不是靠改 Gradle 参数能绕过去的硬伤最终只能把 JDK 切到 17。原文里最值得复用的动作是遇到这类环境报错时不要先盲目搜索而是把完整报错、当前版本、构建命令一起丢给 Cursor让它按 JDK、Gradle、Android SDK、NDK 的顺序给出排查路径。现在这条路径前面加了一步先把 Cursor 的模型请求接到 TaoToken。通道走通后再让它去分析 JDK 11 的 61.0 字节码报错、gradle-wrapper的 zip 损坏、NDK r28c 下载慢效率会稳定很多。TaoToken 前置给 Cursor 准备 Key 与 OpenAI 兼容 Base URLTaoToken 在这个场景里不是编辑器也不是构建工具它只做一件事给 Cursor 提供一个可用的模型请求入口。你需要先拿到两样东西一个 Key一个 OpenAI 兼容 Base URL。第一步打开 TaoToken 官网注册账号https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content第二步进入控制台创建 API Key。这个 Key 就是后面填进 Cursor 的凭证。建议创建后立即复制不要带着首尾空格。第三步回到 Cursor。打开Settings找到Models相关设置。不同版本的 Cursor 菜单文案可能略有差异但核心选项是启用自定义 OpenAI 兼容地址。把 Base URL 填成https://taotoken.net/api这里有两个容易错的地方不要写成https://taotoken.net/api/v1也不要在这个 API 地址后面拼接 UTM 参数。配置地址就是配置地址UTM 只用于博客里的 CTA 链接。然后把刚创建的 Key 粘贴到 API Key 位置Key 占位符统一写成YOUR_API_KEY。模型名按你在 TaoToken 控制台看到的可用模型列表选择不要凭记忆乱填。Cursor 能发出请求、能返回分析结果就说明这条前置通道已经通了。至于 JDK 17 怎么装、Gradle 镜像怎么换、NDK r28c 怎么下仍然由你在终端执行TaoToken 不替你改本地环境。Cursor Models 可复制配置Base URL 不要写成 /v1Key 用 YOUR_API_KEY这一段给可直接照抄的配置项。你不需要改 Claude Code 的settings.json也不需要设置ANTHROPIC_*环境变量本篇是 Cursor入口在 Models 设置里。在 Cursor 中按下面顺序操作打开Settings。进入Models。找到 OpenAI API Key 或自定义 OpenAI 兼容配置区域。启用自定义 Base URL。填入 API 地址与 Key。选择或填写模型 ID。保存后新开一个对话测试。可复制配置如下Base URL: https://taotoken.net/api API Key: YOUR_API_KEY Model: 从 TaoToken 控制台可用模型列表中选择如果你的 Cursor 版本提供的是“Override OpenAI Base URL”之类的输入框逻辑一样地址填https://taotoken.net/api不要追加/v1不要带 UTM。Key 填你创建的那串字符不要加Bearer前缀Cursor 会按自身逻辑处理。模型名如果填错通常会表现为 404 或模型不可用Key 如果复制错通常会表现为 401。配置完成后Cursor 的模型请求会先到 TaoToken再返回结果。你看到的仍然是 Cursor 界面但模型通道已经切到了自定义地址。这个改动只影响 Cursor 的请求出口不影响 Gradle、Android SDK、NDK 和 Flutter 命令。验证请求把 JDK 11 的 61.0 报错丢给 Cursor 后应该看到什么配置完成后不要只问“你好”就结束要用真实报错验证。新建一个 Cursor 对话把 Flutter Android 构建失败的上下文完整贴进去。可以这样发Flutter Android 构建报错Unsupported class file major version 61。 当前环境Flutter 项目Gradle 8.14Android SDK 36本地 JDK 11。 报错发生在 Gradle 配置阶段提示加载不了 Java 17 编译的类。 请按 JDK、Gradle、Android SDK、NDK 的顺序给出排查路径并给出需要执行的检查命令。如果 Cursor 能正常返回你通常应该看到它先确认 61.0 对应 Java 17再指出本地 JDK 11 不满足 Android SDK 36 命令行工具的运行要求。接着它会让你检查java -version、./gradlew -version、flutter doctor -v并建议设置JAVA_HOME到 JDK 17。终端侧可以按这个顺序处理# 查看当前 JDK java -version # macOS 查看已安装 JDK /usr/libexec/java_home -V # 切换到 JDK 17 export JAVA_HOME$(/usr/libexec/java_home -v 17) export PATH$JAVA_HOME/bin:$PATH # 停掉旧 Gradle daemon避免继续用 JDK 11 ./gradlew --stopJDK 17 可以从清华 Adoptium 镜像下载 OpenJDK 17 的 tar.gz解压后放到~/Library/Java/下。Gradle 8.14 如果从默认地址下载慢或者出现ZipException: zip END header not found就改android/gradle/wrapper/gradle-wrapper.propertiesdistributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-8.14-all.zipNDK r28c 体积大用 sdkmanager 单线程下载会非常慢。原文里用的是 aria2c 多线程下载命令可以写成brew install aria2 aria2c -x 16 -s 16 -k 1M \ --max-connection-per-server16 \ -o android-ndk-r28c-darwin.dmg \ https://googledownloads.cn/android/repository/android-ndk-r28c-darwin.dmg下载完成后挂载并复制到 Android SDK 的 NDK 目录hdiutil attach android-ndk-r28c-darwin.dmg -mountpoint /tmp/ndk-mount cp -R /tmp/ndk-mount/AndroidNDK*.app/Contents/NDK/* \ ~/Library/Android/sdk/ndk/28.2.13676358/Maven 依赖如果也慢在android/build.gradle.kts里加阿里云镜像repositories { maven { url uri(https://maven.aliyun.com/repository/google) } maven { url uri(https://maven.aliyun.com/repository/central) } google() mavenCentral() }最终验证目标是flutter build apk --release能通过。看到 APK 生成说明 JDK 11 到 JDK 17 的切换、Gradle 下载、Android SDK 36 和 NDK r28c 这条链已经打通。本篇常见错排查gradle-wrapper.properties、NDK r28c 与 Cursor 认证排障时不要只盯着一个报错。下面这些是本篇场景里最容易反复出现的问题。现象可能原因处理Cursor 报 401Key 复制错误、带空格、已删除回 TaoToken 控制台重新创建 Key再粘贴Cursor 报 404Base URL 写成了/api/v1改成https://taotoken.net/apiCursor 报模型不可用模型 ID 填错或未开通从控制台可用模型列表重新选择Gradle 仍报 major version 61JAVA_HOME没切到 17或旧 daemon 还在./gradlew --stop重开终端确认java -versionGradle zip 损坏默认源下载中断出现zip END header not found改腾讯云镜像删除~/.gradle/wrapper/dists对应缓存重下NDK r28c 下载慢sdkmanager 单线程、网络波动用 aria2c 多线程下载 DMG再复制到 SDK ndk 目录Maven 依赖卡住默认仓库访问慢在build.gradle.kts加阿里云仓库Flutter 仍用旧 JDKshell 配置、IDE 配置、Gradle 配置不一致同时检查终端、Cursor 终端和 Flutter doctor还有一个容易忽略的点Cursor 通道通了不代表 Gradle 就自动用 JDK 17。Cursor 只是帮你分析报错和给出命令真正的环境变量、Gradle daemon、Android SDK 路径仍然在你的机器上。每次改完JAVA_HOME最好执行./gradlew --stop再重新运行构建。如果gradle-wrapper.properties改过镜像也要确认文件没有被其他构建步骤覆盖。NDK r28c 复制完成后检查~/Library/Android/sdk/ndk/下目录名是否与 Gradle 期望一致。CTA继续用 Cursor 排 Flutter 环境链先把 Key 和接入文档收好如果你也要把 Cursor 接到 TaoToken 来排 JDK 11、61.0 字节码、Gradle 8.14、Android SDK 36、NDK r28c 这条环境链建议先完成两个动作在 TaoToken 控制台创建 Key然后按接入文档把 Cursor 的 Models 自定义地址配好。API Keys 入口https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcursor接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcursor配置时记住三件事Base URL 填https://taotoken.net/api不要写成/api/v1Key 用YOUR_API_KEY占位实际值从控制台复制API 地址不要带 UTM。后面装 JDK 17、换腾讯云 Gradle 镜像、用 aria2c 拉 NDK r28c仍然在终端完成。Cursor 负责帮你定位报错TaoToken 负责让 Cursor 的模型请求稳定可达两者分工不要混。