Android 未解决的引用:Kotlin需要在清理后进行2次构建,以便在使用kapt时提取代码

Android 未解决的引用:Kotlin需要在清理后进行2次构建,以便在使用kapt时提取代码,android,annotations,kotlin,Android,Annotations,Kotlin,在我们的Android应用程序中,我们用来访问SQLite数据库。我们正在通过Kotlin引用DBFlow生成的类。我们已经知道,在Kotlin中编写这些类时,Java中有模型类和数据库类作为代码生成 然而,我们仍然必须在每个项目清理之后构建两次代码。在设备上执行第一个构建会导致看似随机的Kotlin类出现ClassNotFoundExceptions(即使它们不访问DBFlow或我们定义的任何模型类生成的代码)。当启用Proguard时,在编译时已经报告了同样的情况,这当然会导致构建失败。第二

在我们的Android应用程序中,我们用来访问SQLite数据库。我们正在通过Kotlin引用DBFlow生成的类。我们已经知道,在Kotlin中编写这些类时,Java中有模型类和数据库类作为代码生成

然而,我们仍然必须在每个项目清理之后构建两次代码。在设备上执行第一个构建会导致看似随机的Kotlin类出现
ClassNotFoundExceptions
(即使它们不访问DBFlow或我们定义的任何模型类生成的代码)。当启用Proguard时,在编译时已经报告了同样的情况,这当然会导致构建失败。第二次构建总是成功的

有趣的是,代码生成在第一次运行时就已经起作用了——类就在那里,IDE也会提取这些类。但是编译器不知何故找不到它们,这让我觉得代码生成在构建过程中发生得太晚了。另一方面,如上所述,还有一些未找到的类,它们与代码生成和/或注释处理无关

那么,有没有比第二次构建更好的解决方案呢

作为参考,我们应用程序的
build.gradle
的相关部分如下所示-就像

def dbflow_version = "3.0.0-beta4"

dependencies {
    kapt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"
}

kapt {
   generateStubs = true
}

编辑:我发现每次修改代码都要重新构建两次。如果我以前没有清理,它在第一次生成时可以正确编译,但是更改根本就没有被拾取。

如果使用kotlin和retrolambda,这可能会修复它:

me.tatarka:gradle-retrolambda:3.4.0

本以为可以通过修复,但不幸的是,启用GenerateSubs后修复似乎不起作用。我与1.0.5-2有完全相同的问题,我也有类似的问题。如果我想生成签名的APK,我需要编译每个buildType/flavor组合两次,这使得自动构建变得更不可用。您找到问题的原因了吗?我当前的项目也遇到了类似的问题:(似乎已经解决了。在对Kotlin和Android Studio插件进行了几次更新之后,我几乎只需要构建两次。我删除了生成存根之类的东西,因为这似乎不是必需的。不,我们在迁移到Kotlin时抛弃了retrolambda。无论如何,谢谢!)我正在将kotlin应用到使用retrolambda的旧项目中,因此可以同时使用这两个项目。天哪,这修复了我在kotlin和Android中遇到的所有奇怪问题。太神了谢谢,我刚刚也遇到了同样的问题。我必须构建两次才能显示当前的更改。有点奇怪的是,总是会出现上一轮编译的更改。你和这个问题有联系吗?我很好奇为什么会发生这种事。