Android 数据绑定:如何避免“找不到 KaptTask”警告

Posted

技术标签:

【中文标题】Android 数据绑定:如何避免“找不到 KaptTask”警告【英文标题】:Android Data Binding: How to avoid "cannot find the KaptTask" warning 【发布时间】:2020-08-31 15:19:01 【问题描述】:

我有一个包含多个库模块的大型 android 项目。他们都使用 Kotlin,而且很多都启用了数据绑定。项目和所有模块都可以正常构建和运行,没有错误。

但是,我在 Gradle 同步日志中收到了我认为是误报的每个模块的警告:

> Configure project :feature-a
Kotlin plugin is applied to the project :feature-a but we cannot find the KaptTask. Make sure you apply the kotlin-kapt plugin because it is necessary to use kotlin with data binding.

> Configure project :feature-b
Kotlin plugin is applied to the project :feature-b but we cannot find the KaptTask. Make sure you apply the kotlin-kapt plugin because it is necessary to use kotlin with data binding.

> Configure project :feature-c
Kotlin plugin is applied to the project :feature-c but we cannot find the KaptTask. Make sure you apply the kotlin-kapt plugin because it is necessary to use kotlin with data binding.

[... etc. for dozens of modules ...]

我已检查以确保正确应用了“kotlin-kapt”插件。我正在为所有模块使用 Kotlin Gradle DSL,并且正在应用这样的插件:

plugins 
    id("com.android.library")
    id("kotlin-android")
    id("kotlin-android-extensions")
    id("kotlin-kapt")
    id("androidx.navigation.safeargs.kotlin")

是什么导致了这个警告,它实际上是一个问题,我如何让它消失?

【问题讨论】:

【参考方案1】:

如果您在 buildSrc/build.gradle[.kts]:https://issuetracker.google.com/issues/123491449 中声明了 Android Gradle 插件依赖项,也会出现此问题

解决此问题的方法是在 buildSrc/build.gradle[.kts] 而不是根项目的 build.gradle[.kts] 文件中声明 所有 插件依赖项

【讨论】:

【参考方案2】:

这个问题背后的真正原因是kotlin gradle 插件没有被应用

您可以在TaskManager中找到打印错误的代码

try 
   //noinspection unchecked
   kaptTaskClass = (Class<? extends Task>) Class.forName("org.jetbrains.kotlin.gradle.internal.KaptTask");
 catch (ClassNotFoundException e) 
            logger.error(
                    "Kotlin plugin is applied to the project "
                            + project.getPath()
                            + " but we cannot find the KaptTask. Make sure you apply the"
                            + " kotlin-kapt plugin because it is necessary to use kotlin"
                            + " with data binding.");
        

如你所见,无法解析org.jetbrains.kotlin.gradle.internal.KaptTask

就我而言,这是在迁移到约定插件之后发生的。我忘了把implementation kotlinPlugin加到buildSrc/build.gradle

repositories  ... 

dependencies 
    implementation gradlePlugins.android
    implementation gradlePlugins.kotlin

添加后问题就解决了

奇怪的是,我忽略了这个警告几个星期,因为一切都很好,直到突然数据绑定停止工作。我的猜测是存在某种竞争条件,我们确实在构建的其他点应用了 kotlin 插件,并且在进行了一些更改后它停止了工作。

【讨论】:

【参考方案3】:

此错误来自数据绑定注释处理器。 要禁用它,您应该只应用一次kotlin-kapt 插件。 在除主模块之外的任何模块中执行以下操作:

plugins 
    ...
    id("kotlin-kapt") apply false
    ...

【讨论】:

【参考方案4】:

Kotlin 插件应用于项目 :business_module:module_web 但我们找不到 KaptTask。确保您应用了 kotlin-kapt 插件,因为有必要将 kotlin 与数据绑定一起使用。在应用的 build.gradle 中应用插件:

apply plugin: 'kotlin-kapt'

【讨论】:

【参考方案5】:

如果你的项目有 buildSrc,你可以删除 build.gradle ->

implementation gradleApi()
implementation localGroovy()

replease remote url 

【讨论】:

以上是关于Android 数据绑定:如何避免“找不到 KaptTask”警告的主要内容,如果未能解决你的问题,请参考以下文章

Android官方文档之DataBinding库

数据绑定如何避免 WPF 中的递归更新?

如何避免双向绑定的摘要周期延迟

如何将架构组件与android上的数据绑定结合起来?

Android 数据绑定库 vs Kotlin Android 扩展

使用数据绑定时如何在适配器中绑定 viewModel