如何在Android Studio 3.0.0中使用数据绑定和Kotlin。

108

我刚开始使用Android Studio 3.0.0,但每次尝试构建我的项目时都会出现以下错误:

Error:Circular dependency between the following tasks:
:app:compileDebugKotlin
+--- :app:dataBindingExportBuildInfoDebug
|    \--- :app:compileDebugKotlin (*)
\--- :app:kaptDebugKotlin
     \--- :app:dataBindingExportBuildInfoDebug (*)
(*) - details omitted (listed previously)
我正在使用。
kapt "com.android.databinding:compiler:2.2.0"

我之前使用的是

androidProcessor "com.android.databinding:compiler:2.2.0"

它之前正常运行了... 我哪里出错了?

谢谢!


1
似乎是一个错误,已创建问题:https://youtrack.jetbrains.com/issue/KT-17936 - Vyacheslav Gerasimov
即使没有任何数据绑定,这个错误也会出现。你只需要使用1.1.2-4版本的Kotlin并应用插件:'kotlin-kapt'。然后你就会得到这个错误 错误:以下任务之间存在循环依赖关系: :app:compileDebugKotlin --- :app:kaptDebugKotlin --- :app:compileDebugKotlin () () - 细节已省略(先前列出) - Arsenius
相关问题:https://issuetracker.google.com/issues/38471980 - BoD
4个回答

80
更新:这个问题已经在Android Gradle插件3.0.0-alpha3中得到解决,您需要在项目根目录下的build.gradle文件中更改buildscript dependencies。请保留HTML标签。
classpath 'com.android.tools.build:gradle:3.0.0-alpha3'

这实际上是Kotlin Gradle插件1.1.2-4与Android Gradle插件3.0.0-alpha1互操作中的一个bug,原因是任务的输入和输出设置方式(以及因此任务如何通过依赖关系连接)引起的。
感谢@VyacheslavGerasimov创建了问题KT-17936
作为一个临时解决方案,您可以尝试恢复到Kotlin Gradle插件1.1.2-2并禁用增量编译:
在您项目的根目录下的build.gradle文件中,更改Kotlin Gradle插件的版本号:
buildscript {
    ...
    dependencies {
        ...
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-2'
    }
}

local.properties添加到项目根目录,并添加以下行:
kotlin.incremental=false

这是一个已知问题,即Kotlin Gradle插件1.1.2-2及以下版本与最新的AGP版本不兼容,并且禁用增量编译似乎可以解决该崩溃。


1
@LeandroBorgesFerreira,你可以使用它们中的任何一个,因为Gradle也会检测和解释项目中的local.properties文件。嗯,也许local.properties更适合于本地机器属性。 - hotkey
1
这导致了这个错误: https://dev59.com/VaHia4cB1Zd3GeqPaN0i - gderaco
@gderaco,请确保禁用Kotlin增量编译。你提到的错误是由1.1.2版本中增量编译代码与较新的Android Gradle插件不兼容所致。 - hotkey
6
回滚到版本号为1.1.2-3也是可以的。当使用Kotlin 1.1.2-4和kotlin-kapt插件时,Android Studio 2.3.2和Gradle 2.3.2也会出现相同的问题。 - Arsenius
1
基于 https://issuetracker.google.com/issues/38447344 的@hotkey,这是Android插件中的问题,而不是Kotlin Gradle插件。已经进行了修复,并计划在下一个3.0.0 alpha版本中发布。 - Nimrod Dayan
显示剩余3条评论

41

看起来您需要在模块级别的应用程序.gradle文件中添加3个gradle条目才能添加数据绑定。

  1. apply plugin: 'kotlin-kapt'
  2. android { ... dataBinding { enabled = true } }
  3. dependencies { ...... kapt "com.android.databinding:compiler:$compiler_version" }

请注意,我在项目级别的build.gradle文件中将编译器版本设置为一个变量,以便可以从单个位置进行管理。

默认值为:ext.kotlin_version = '1.1.3-2'

我使用括号语法进行了添加:

ext{
    kotlin_version = '1.1.3-2'
    compiler_version = '3.0.0-beta6'
}

1
这是正确的答案,需要添加kotlin-kapt和该依赖项。顶部的答案已经不再相关了。 - SpaceMonkey
喜欢使用版本变量 - Shirane85
我得到了以下信息:- 在所有版本中[kapt] 发生了异常:java.lang.NullPointerException - Pavel Zaitsev
@PavelZaitsev 我已经有一段时间没有使用Android Studio了。 - Rubber Duck

18

对于仍在寻找正确解决方案的人,谷歌已经在Android Studio 3.0 Canary 3版本中修复了此问题。

2017年6月2日星期五

我们刚刚发布了Android Studio 3.0 Canary 3到Canary和Dev频道。 Android Gradle Plugin 3.0.0-alpha3也通过maven.google.com发布。此版本修复了GradleKotlin等许多问题。我们继续在Studio 3.0的所有领域修复错误,因此请继续提供反馈。

有效的gradle配置:

build.gradle(project)

buildscript {
    ext.kotlin_version = '1.1.2-4'
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

build.gradle (模块)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'


android {
    dataBinding.enabled = true
}
dependencies {
    kapt "com.android.databinding:compiler:3.0.0-alpha3"
}

如何在Android Studio 2.3.2中解决此问题? - Arsenius
您可以使用旧版本的Kotlin插件,将增量设置为false。请查看“hotkey”的先前答案。 - Prokash Sarkar
1
不,1.1.2-4 仍然无法工作。你仍然需要使用 1.1.2-2 并且在你的 build.gradle (module) 中添加 kapt "com.android.databinding:compiler:3.0.0-alpha3",否则你会得到 Unresolved reference: databinding 的错误。 - 0leg
不仅限于1.1.2-5 - Daivid

3
如果您使用的是Kotlin Gradle插件1.3及以上版本,则无需指定kapt "com.android.databinding:compiler:$plugin_version"
只需在您的build.gradle文件中指定dataBinding即可。
参考链接:https://youtrack.jetbrains.com/issue/KT-32057
android {
    ...
    dataBinding {
        enabled = true
    }
}

或者

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

但是你仍然会收到警告,除非你添加//noinspection DataBindingWithoutKapt - Raphael C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接