Gradle插件更新后,Android Databinding构建失败并迁移到annotationProcessor

时间:2017-07-18 11:39:20

标签: android android-studio android-gradle android-databinding android-build

  • 要在我的Android Studio版本中支持Instant Run,我需要将我的Gradle插件从版本2.2.3升级到2.3.3
  • 我知道我应该migrate to annoationProcessor并且我相信我已经正确地遵循了该指南
  • 执行此操作后, Android数据绑定代码生成失败

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

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

这应该是成功构建项目所需的全部内容。但它并没有建立起来。

构建输出

  

Gradle build在12s 481ms

完成了101个错误和23个警告

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

  
      
  • C:\用户... \ FooAdapter.java      
        
    • 错误:包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.generationalFileOutDir,android.databinding.xmlOutDir,android.databinding.artifactType,android.databinding.printEncodedErrors,android.databinding.isTestVariant]'

我想指出......

  • 我认为我在某些XML文件中没有错误,绑定表达式或命名问题。当我使用旧的gradle插件版本切换回Git分支(以及所有其他源文件是最新的)时,同一组源和XML构建
  • 我确实增加了输出构建错误的限制,如here所述,虽然现在似乎没有相关性,因为正如您所看到的,我目前只有"只有&#34 ; 101错误。 :)

其他信息

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

  1. build.gradle DiffChecker link
  2. app/build.gradle DiffChecker link
  3. 另外,作为一个快速概述,这里列出了一些更有趣的"插件和项目使用的库:

    • 科特林
    • Android数据绑定
    • 改造
    • 匕首
    • ButterKnife(我知道......)
    • Multidex支持库

    有没有人知道可能是什么问题?任何帮助或想法都会非常感激!

3 个答案:

答案 0 :(得分:13)

我有完全相同的警告。 gradle中的这一行解决了这个问题:

kapt "com.android.databinding:compiler:3.0.1"

希望它会帮助某人

<强>更新
3.0.1Android Plugin Version

答案 1 :(得分:2)

如果你看到无数的构建错误,就像在这种情况下提到数据绑定一样,那么问题通常就在其他地方。数据绑定因无关的构建问题而停止在其轨道上,并且抱怨非常大声。处理它的唯一方法是找到与数据绑定无关的构建错误。一旦它们被修复,数据绑定就可以再次完成它并保持沉默。不幸的是,您经常需要多次重复此方法,直到找到所有非数据绑定问题。这肯定是一项艰巨的任务,但不幸的是,在谷歌设法提供更健全的构建环境之前,你无能为力。

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

我有机会猜测 - Dagger 2是触发此问题的常见来源,可能与您的annotationProcessor更改有关;所以要注意Dagger的错误。但是你的问题可能是由其他事情引起的,比如你提到的其他注释处理器 - 在你努力挖掘构建错误之前,你不会确切知道。

答案 2 :(得分:2)

似乎一切都归结为使用Kotlin的项目。实际上我们把它混合在一起:有些类使用普通的旧Java,而有些类用Kotlin编写。迁移不完整。 :)

我认为如果没有Kotlin,将apt替换为annotationProcessor就足够了,我根本不会遇到这个问题。

解决方案

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

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

  • annotationProcessor 'com.example.my.library:x.y.z
  • kapt 'com.example.my.library:x.y.z