Android数据绑定构建失败后,Gradle插件更新迁移到annotationProcessor

  • 为了在我的Android Studio版本中支持即时运行,我需要将我的Gradle插件从版本2.2.3 升级2.3.3
  • 我知道我应该迁移到annoationProcessor ,我相信我已经正确地按照该指南
  • 这样做后, Android DataBinding代码生成失败

先前链接的迁移指南指出,我需要的只是

  • 确保你在Android Gradle 2.2插件或更新
  • 从构建脚本中删除android-apt插件
  • 将所有apt,androidTestApt和testApt依赖关系更改为新的格式

这应该是成功构建项目所需要的一切。 然而它并没有建立。

建立输出

Gradle版本在12s 481ms内完成了101个错误和23个警告

所有的错误都遵循相同的模式:

  • C:\用户\ FooAdapter.java
    • 错误:package com.example.app.databinding不存在
    • 错误:找不到符号类ItemFooBinding

一个有趣的消息可以在构建控制台中找到:

警告:以下选项不被任何处理器识别:'[android.databinding.minApi,android.databinding.enableDebugLogs,android.databinding.sdkDir,android.databinding.bindingBuildFolder,android.databinding.enableForTests,android.databinding.modulePackage, android.databinding.generationTestVariant] [android.databinding.printTestVariant] [android.databinding.printTestVariant] [android.databinding.printTestVariant]

我想指出…

  • 我认为我没有在一些XML文件 ,绑定表达式或命名问题的错误。 当我使用旧的gradle插件版本切换回Git分支(以及所有其他源文件是最新的)时,同一组源代码和XML构建,
  • 我确实增加了这里所讨论的输出构建错误的限制,尽管现在看起来并不相关,因为你可以看到,我目前只有“101”错误。 🙂

附加信息

以下差异显示了我如何修改我的Gradle文件:

  1. build.gradle DiffChecker链接
  2. app/build.gradle DiffChecker链接

此外,作为一个快速概述,这里是项目使用的一些“更有趣的”插件和库列表:

  • 科特林
  • Android数据绑定
  • 领域
  • 改造
  • 匕首
  • 黄油刀(我知道…)
  • Multidex支持库

有没有人有线索可能是什么问题? 任何帮助或想法将非常感谢!

看来这一切都归结到我的项目使用Kotlin 。 实际上,我们把它混合在一起:有些类使用普通的Java而有些则使用Kotlin。 不完整的迁移 🙂

我假设没有Kotlin,用annotationProcessor替换apt就足够了,我根本就不会碰到这个问题。

注释需要由annotationProcessorkapt来处理 ,这似乎是Kotlin自己的注释处理器。

对于使用注释的每个Gradle依赖项,应该在应用程序级别的build.gradle中包含以下build.gradle

  • annotationProcessor 'com.example.my.library:xyz
  • kapt 'com.example.my.library:xyz

在这种情况下,当你看到无数的构建错误提到数据绑定时,问题通常就在别的地方。 数据绑定只是因为不相关的构建问题而被阻止,并且抱怨过度。 处理这个问题的唯一方法就是找出与数据绑定无关的构建错误。 一旦修好了,数据绑定就可以再做一次,保持沉默。 不幸的是,你经常需要重复这个方法几次,直到你发现所有非数据绑定问题。 这确实是一项艰巨的任务,但不幸的是,除非谷歌能够提供一个更为完善的构建环境,否则就没有别的办法可以做了。

这就是为什么建议将构建错误限制增加到100以上的原因 – 您不会看到导致问题的实际错误,因为它们通常不会在列表的早期出现。

我会猜一猜 – Dagger 2是触发这个问题的常见来源,这可能与你的annotationProcessor变更有关; 所以要注意匕首错误。 但是,您的问题可能是由其他事情引起的,就像您提到的其他注释处理器一样 – 只有在您努力挖掘构建错误之前,您才会确定知道。