在使用Dagger,Room和LiveData时调试DataBinding错误

在我的Android项目中,我使用Android Studio 3.0-beta6,restofit2进行其余调用,Room进行持久化,LiveData进行反应式编程,使用RxJava / RxAndroid。 有几个注释处理器在使用中:

  1. android.arch.lifecycle:编译
  2. android.arch.persistence.room:compiler
  3. com.google.dagger:匕首编译
  4. com.google.dagger:匕首机器人处理器
  5. org.projectlombok:龙目岛

每当我添加一个新的Retrofit2服务,使用Room注解来模拟类,Room Dao类时,我发现我遇到了一个数据绑定代错误:

Error:(3, 27) error: cannot find symbol class DataBindingComponent

一个巨大的“找不到符号”错误的列表已被排除,但我的问题的根本原因往往不是放射。 调试根本原因需要很长时间,因为错误报告似乎非常弱。

在被烧了几次之后,在这种情况下,我使用了一些策略来隔离问题:

  1. 搁置我的更改,并以小增量引入更改,并在吹走我的应用程序的构建和模式输出文件夹后,执行干净的重建。 通常这意味着首先引入模型类的变化。 接下来介绍房间需要的Jackson转换器,以便在房间实体模型类中保留非原始类型。 最后介绍了Dao类和Room数据库子类。
  2. 检查实体类以确保它们具有@PrimaryKey,@Entity,@TypeConverters Room注释。 确保TypeConverter类指定了转换器类FooConverter,而不是正在转换的类Foo
  3. 检查Dao类以确保@Query注释中的tablename中没有复制粘贴错误

但是,有时候我仍然遇到数据生成错误,根本原因是未知的。

我想知道是否有任何好的技术来隔离这个问题的根本原因。 是否有方法打开注释处理器(特别是Room)中的调试日志记录。

TIA对此有任何指导。 我怀疑很多人都面临这种情况。

是的,问题是匕首,数据绑定和房间使用注释处理器。 这意味着一个代码生成器在由另一个处理被破坏的代码时会遇到问题。

我很久以前就加了一个问题 。 谷歌团队希望改善这种情况,但通常情况下,您可以直接在顶部看到您的gradle日志中的错误。

在开发这些库之后,你会发现问题很简单。

下面的技术给我在Android Studio的消息面板中有关我的Dao类中的问题的有意义的错误。 它告诉我在Room的@Query注释中我的表名中有一个输入错误。 什么给了更清晰的消息是,我改变了build.gradle增加了由java编译器发出的错误的最大数量。

我在build.gradle的末尾添加了下面的代码:

 allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xmaxerrs" << "5000" } } } 

希望这可以帮助别人。

在你的build.gradle模块级别使用…

  apply plugin: 'kotlin-kapt' android { ... sourceSets { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) main.java.srcDirs += [file("$buildDir/generated/source/kapt/main")] } ... } ... compile "com.google.dagger:dagger:2.12" ... kapt "android.arch.persistence.room:compiler:1.0.0-beta1" kapt "com.google.dagger:dagger-compiler:2.12" kapt "com.android.databinding:compiler:2.3.3" 

在你的项目build.gradle

 apply from: 'buildsystem/dependencies.gradle' buildscript { ext.kotlin_version = '1.1.51' repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //classpath "com.google.dagger:dagger-compiler:2.8" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } task clean(type: Delete) { delete rootProject.buildDir }