2

在我的 Android 项目中,我使用 Android Studio 3.0-beta6,retrofit2 用于休息调用,Room 用于持久性,LiveData 用于使用 RxJava / RxAndroid 进行反应式编程。有几个 annotationProcessors 正在使用:

  1. android.arch.lifecycle:编译器
  2. android.arch.persistence.room:编译器
  3. com.google.dagger:dagger 编译器
  4. com.google.dagger:dagger-android-processor
  5. org.projectlombok:lombok

每次我添加一个新的 Retrofit2 服务、带有 Room 注释的模型类、Room Dao 类时,我发现我遇到了数据绑定生成错误:

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

发出了大量“找不到符号”错误,但我的问题的根本原因通常没有发出。调试根本原因需要大量时间,因为错误报告似乎很弱。

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

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

然而,有时我仍然遇到数据组合生成错误并且根本原因未知。

我想知道是否有任何好的技术可以在这种情况下隔离根本原因。有没有办法在注释处理器(特别是 Room)中打开调试日志记录。

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

4

3 回答 3

4

以下技术在 Android Studio 的消息窗格中给了我关于我在 Dao 类中的问题的有意义的错误。@Query它告诉我在 Room 的注释中我的表名有错字。给出更清晰的信息是我通过 build.gradle 进行了更改,以增加 java 编译器发出的最大错误数。

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

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

希望这对其他人有帮助。

于 2017-10-26T19:56:45.017 回答
1

是的,问题在于 Dagger、Databinding 和 Room 使用注释处理器。这意味着一个代码生成器在另一个处理损坏的代码时遇到问题。

很久以前添加了一个问题。Google-Team 希望改进这一点,但通常您可以直接在顶部看到 gradle 日志中的错误。

在使用这些库进行一些开发之后,您会发现问题很容易。

于 2017-10-26T20:00:09.673 回答
-1

在您的 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
}
于 2017-10-27T22:02:19.910 回答