在 Android + Flutter 混合工程中排查与修复常见 Gradle 编译错误


目录

  1. 快速定位(摘要)
  2. 常见错误与原始日志片段(按类别)
  3. 分步排查与可复制修复片段(按优先级)
  4. 关键配置模板(可直接替换)
  5. FAQ(覆盖多种问法)
  6. HowTo(JSON-LD,结构化步骤)
  7. 检查清单(可复制执行)
  8. 常见误区与避免方法

1. 快速定位

从你的日志可以提炼出三类交织影响的主要问题:

  • 依赖/插件与 JDK 不兼容com.github.Ysj001.BytecodeUtilDoKitPluginCompat 等声明为 Java 17,而构建消费者使用 Java 11,导致 classpath 无法解析(日志多次出现 “Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11”)。
  • Flutter 模块 include / 本地依赖缺失include_flutter.groovy 找不到,且 fiat_module 本地 path 依赖不存在,project(':flutter') 未被 include,导致 Gradle 无法包含 Flutter 子工程。
  • Kotlin / JVM target 不一致导致源码编译失败compileJava (11)compileKotlin (1.8) 不一致(警告:在 Gradle 8.0 会成为错误),引发 FlutterPlugin.ktUnresolved reference: filePermissions / user / read / write 等无法解析的问题。

下文按从“最优先必须解决”的顺序,给出详尽的排查步骤与配置样例。


2. 常见错误与原始日志片段

A. 插件/依赖与 JDK 版本不匹配

No matching variant of com.github.Ysj001.BytecodeUtil:plugin:2.1.3 was found...
Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11

同类错误还出现在 DoKitPluginCompat:3.7.1-v1 的解析上,日志结构一致,均指向 Java 版本不匹配。


B. Flutter include 与本地依赖缺失

Settings file 'D:\coinbyte_app-master\settings.gradle' line: 85
A problem occurred evaluating settings 'coinbyte_app-master'.
> D:\coinbyte_flutter_entry\.android\include_flutter.groovy (D:\coinbyte_flutter_entry\.android\include_flutter.groovy)

以及:

Because coinbyte_flutter_entry depends on fiat_module from path which doesn't exist (could not find package fiat_module at "..\fiat_module"), version solving failed.
Failed to update packages.

和:

Project with path ':flutter' could not be found in project ':flutter_modules'.

这些条目表明 Flutter 模块没生成 .android/include_flutter.groovy 或引用路径错误,并且本地 path 依赖 fiat_module 缺失导致 flutter pub get 失败。


C. Kotlin / JVM target 不一致与 FlutterPlugin.kt 编译失败

w: Inconsistent JVM-target compatibility detected for tasks 'compileJava' (11) and 'compileKotlin' (1.8).
This will become an error in Gradle 8.0.
...
e: .../flutter/packages/flutter_tools/gradle/src/main/kotlin/FlutterPlugin.kt:758:21 Unresolved reference: filePermissions
e: .../FlutterPlugin.kt:759:25 Unresolved reference: user
e: .../FlutterPlugin.kt:760:29 Unresolved reference: read
e: .../FlutterPlugin.kt:761:29 Unresolved reference: write

日志显示 Kotlin 编译器在 Flutter Gradle 插件源码中解析不到某些 API,典型表现为 Unresolved reference


D. 其它信息(DataBinding / BR / DepAnn)

import jp.co.huobi.japan.BR;
...
[dep-ann] δʹ�� @Deprecated ���ѹ�ʱ����Ŀ����ע��

BR 未生成提示 DataBinding 未正确启用或 namespace mismatch;dep-ann@Deprecated 注解缺 Javadoc 的警告。


3. 分步排查与可复制修复片段(按优先级)

下面步骤按执行顺序排列:先解决会影响依赖解析与编译链的根因,再处理 Flutter 模块与 DataBinding 问题。每一步包含操作命令 / 配置片段 / 验证方法,直接复制到项目可立即执行或替换。

步骤 1:确认并强制使用目标 JDK(优先级最高)

目标:使 Gradle 使用与依赖兼容的 JDK(日志显示插件 target Java 17,需 JDK 17)。

操作

  1. 在系统/项目中确认 JDK 路径(示例路径仅作占位,请替换为你的实际路径)。
  2. 在项目根 gradle.properties 中加入或更新:
org.gradle.java.home=C:/jdk17
org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8
  1. 临时验证(Windows CMD):
set JAVA_HOME=C:\jdk17
set PATH=%JAVA_HOME%\bin;%PATH%
gradlew.bat -version
gradlew.bat clean build --refresh-dependencies

验证gradlew -version 输出中 JVM 路径应指向 JDK17;构建若因“Java 版本不匹配”错误消失,则步骤成功。


步骤 2:统一 Kotlin / Java 的 JVM target(避免 compileJava vs compileKotlin 不一致)

目标:把所有模块的 Java / Kotlin 目标统一为 17(或与插件需求一致)。

可放在根 build.gradlesubprojects 段,或在模块级 build.gradle 中设置

subprojects {
    afterEvaluate { project ->
        if (project.plugins.hasPlugin('kotlin') || project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
            project.extensions.findByType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension)?.jvmToolchain {
                languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(17))
            }
            project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
                kotlinOptions.jvmTarget = "17"
            }
            project.extensions.findByName("android")?.with {
                compileOptions {
                    sourceCompatibility JavaVersion.VERSION_17
                    targetCompatibility JavaVersion.VERSION_17
                }
            }
        }
    }
}

验证:重新运行 ./gradlew clean buildcompileKotlincompileJava 的 JVM-target 都应为 17,不再出现不一致警告。


步骤 3:确保根 build.gradle 提供 AGP 与 Kotlin 插件(避免 com.android.library 未找到)

背景日志

Plugin [id: 'com.android.library'] was not found in any of the following sources

操作:在根 build.gradlebuildscript 中加入必要 classpath(示例):

buildscript {
    ext.kotlin_version = '1.8.20'
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:8.1.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

验证:Gradle 同步不再报找不到 com.android.library 插件。


步骤 4:修复 Flutter 模块的本地依赖与生成 include 文件

错误

Because coinbyte_flutter_entry depends on fiat_module from path which doesn't exist (could not find package fiat_module at "..\fiat_module")

操作

  1. 打开 coinbyte_flutter_entry/pubspec.yaml,定位 fiat_modulepath 配置;确认相对路径存在。
  2. fiat_module 缺失,补入该目录或注释该依赖临时通过 flutter pub get
  3. 进入 Flutter 模块并执行:
cd coinbyte_flutter_entry
flutter pub get
flutter build aar   # 或 flutter build apk,按工程实际需要

执行成功会生成 .android/include_flutter.groovy,供根 settings.gradle include 引用。

验证:检查 D:\coinbyte_flutter_entry\.android\include_flutter.groovy 是否存在;若存在,重新同步 Android 项目。


步骤 5:修正 settings.gradle 中对 Flutter include 的路径与拼写

常见问题:日志显示多处拼写错误 coinbyte_app-maste(缺 r),以及对 .android/include_flutter.groovy 的引用路径不正确。

操作(示例)

在根 settings.gradle 中使用相对路径正确引用:

// 如果 include_flutter.groovy 已生成
apply from: 'coinbyte_flutter_entry/.android/include_flutter.groovy'

或显式 include Flutter module:

include ':flutter'
project(':flutter').projectDir = new File(rootDir, 'coinbyte_flutter_entry/.android/Flutter')

验证./gradlew projects 不再报 FileNotFoundException:flutter 项存在。


步骤 6:检查并删除模块自引用与循环依赖

日志示例

Circular dependency between the following tasks:
:flutter_modules:compileDebugAidl
\--- :flutter_modules:compileDebugAidl (*)

操作

  • 搜索 build.gradle 中所有 project(':...') 调用,确认没有 project(':flutter_modules')flutter_modules 自身内部被引用。
  • flutter_modules/build.gradledebugImplementation project(':flutter'),确认 :flutter 是一个独立模块并已被 include;若 :flutter 实际不存在,改为正确的模块名或删除该依赖行。

验证:运行 ./gradlew :flutter_modules:dependencies,确认没有自依赖循环。


步骤 7:DataBinding 与 BR 未生成问题

日志示例

import jp.co.huobi.japan.BR;
错误: 找不到符号

操作

  1. 在对应模块 build.gradle 中启用 DataBinding:
android {
    buildFeatures {
        dataBinding true
    }
    namespace "jp.co.huobi.japan"
}
  1. 确认相关 layout 文件使用 <layout> 根标签,否则不会生成 BR
  2. @Deprecated 的 Java 方法触发 dep-ann 警告,请为其添加 @deprecated Javadoc 注释,或在 lint 配置临时禁用 DepAnn

验证BR 文件在 build/generated 下生成,编译报错消失。


4. 关键配置模板(可直接替换)

以下片段均基于日志内容并可直接粘贴或按需合并到项目中。

gradle.properties

org.gradle.java.home=C:/jdk17
org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8
kotlin.code.style=official

根 build.gradle(片段)

buildscript {
    ext.kotlin_version = '1.8.20'
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:8.1.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

模块统一 JVM / Kotlin 配置(放入根 build.gradle 的 subprojects)

subprojects {
    afterEvaluate { project ->
        if (project.plugins.hasPlugin('kotlin') || project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
            project.extensions.findByType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension)?.jvmToolchain {
                languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(17))
            }
            project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
                kotlinOptions.jvmTarget = "17"
            }
            project.extensions.findByName("android")?.with {
                compileOptions {
                    sourceCompatibility JavaVersion.VERSION_17
                    targetCompatibility JavaVersion.VERSION_17
                }
            }
        }
    }
}

Flutter 模块 pubspec 本地依赖示例(若存在本地模块)

dependencies:
  fiat_module:
    path: ../fiat_module

fiat_module 在本地不存在,请将其补入或临时注释该依赖以便 flutter pub get 能通过(注意代码调用处会受影响)。


5. FAQ

Q:为什么 Gradle 会提示某个插件“声明为 Java 17,而消费者需要 Java 11”?

A:构建时 Gradle 会对 artifact 的变体/属性(包括目标 Java 版本)做匹配。如果 artifact 标明兼容 Java 17,而当前 Gradle 运行或消费者的 JVM 是 Java 11,Gradle 会判定不兼容并拒绝解析,报类似 “Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11”的错误。


Q:include_flutter.groovy 文件丢失如何快速恢复?

A:进入 Flutter 模块目录,确保 pubspec.yaml 的本地依赖(如 fiat_module)路径存在并 flutter pub get 成功,再执行 flutter build aar(或 flutter build apk),Flutter 工具链会生成 .android/include_flutter.groovy。若 pub get 失败,请先修复本地依赖路径或注释依赖再尝试。


Q:出现 Unresolved reference: filePermissions 等,是 Flutter SDK 的 bug 吗?

A:不一定。该错误往往出现在 Kotlin 编译目标过低或运行时 JVM 不一致时,某些 API 在较低目标不可见,导致编译器报未解析。统一 Kotlin 的 jvmTarget 与 Java 版本(例如都设为 17)可解决。


Q:是否可以不升级到 JDK17?

A:可以,但只有当所有被用到的插件和依赖都有兼容 Java 11 的版本时。日志中多次显示某些插件以 Java 17 打包,若找不到兼容版本,必须升级 JDK 才能解析这些依赖。


6. HowTo

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "在 Android + Flutter 混合工程中修复 Gradle 编译错误(JDK/Kotlin/Flutter 模块)",
  "description": "基于构建日志,按步骤修复 JDK 版本、Kotlin JVM target、Flutter 模块 include 与本地依赖问题。",
  "step": [
    {
      "@type": "HowToStep",
      "name": "确认并使用 JDK17",
      "text": "在 gradle.properties 中设置 org.gradle.java.home 指向 JDK17,并通过 gradlew -version 验证。"
    },
    {
      "@type": "HowToStep",
      "name": "统一 Kotlin 和 Java 的 JVM target",
      "text": "在根 build.gradle 或模块级中使用 kotlin.jvmToolchain 和 kotlinOptions.jvmTarget 设为 17。"
    },
    {
      "@type": "HowToStep",
      "name": "修复 Flutter 模块本地依赖并生成 include_flutter.groovy",
      "text": "在 Flutter 模块目录运行 flutter pub get,然后 flutter build aar,生成 .android/include_flutter.groovy。"
    },
    {
      "@type": "HowToStep",
      "name": "修正 settings.gradle 的 Flutter include 路径",
      "text": "确保 apply from 或 include 的相对路径拼写与文件系统一致,避免路径拼写错误。"
    }
  ]
}

7. 检查清单(逐项执行并记录结果)

将下面清单逐项执行,记录每步输出并根据输出继续下一步:

  1. java -version → 记录 Java 版本(应为 17)
  2. .\gradlew.bat -version → 记录 Gradle 正在使用的 JVM 路径
  3. 查看 gradle.propertiesorg.gradle.java.home 是否设置正确
  4. 检查根 build.gradleclasspath "com.android.tools.build:gradle:..." 是否存在
  5. 检查 ext.kotlin_version 是否为 1.8.20(或你决定的版本)
  6. 进入 coinbyte_flutter_entry,运行 flutter pub get,记录是否成功;若失败,查看 pubspec.yaml 的 local path 依赖(如 fiat_module)并修复路径
  7. 运行 flutter build aar(记录是否生成 .android/include_flutter.groovy
  8. 在根目录运行 ./gradlew clean build --refresh-dependencies,记录第一个出现的错误并回溯定位

8. 常见误区与避免方法

  • 误区 1:以为只需升级 Gradle 就能解决所有问题。
    避免方法:Gradle、AGP、Kotlin、JDK 需要匹配,单独升级某一项可能无法解决依赖的 JVM 版本不一致问题。

  • 误区 2:直接删掉 include_flutter.groovy 的引用以跳过错误。
    避免方法:这会让项目丢失 Flutter 模块的正确 include,导致运行时缺失功能。应先生成该文件或正确引用已存在的文件。

  • 误区 3:把模块的 implementation project(':module') 随意复制到任意模块,造成循环依赖。
    避免方法:确认 module 关系与 settings.gradle 中的 include 顺序与路径,避免模块自依赖或互相依赖造成循环。


结语

  • 请按“检查清单”逐项执行并把 java -version.\gradlew -version 输出以及 gradle.properties、根 build.gradle(前 150 行)贴回;有这些信息可进一步给出精准修改补丁。
  • 若需要,我可以基于你当前工程目录结构直接给出逐文件修改 diff(替换 gradle.propertiessettings.gradle 与根/模块 build.gradle),便于一键应用并验证。