【问题标题】:Unresolved reference: Kotlin needs 2 builds after clean to pick up code when using kapt未解决的参考:使用 kapt 时,Kotlin 需要 2 次构建后清理才能获取代码
【发布时间】:2016-03-04 14:52:50
【问题描述】:

在我们的 Android 应用中,我们使用 DBFlow 来访问 SQLite 数据库。我们通过 Kotlin 引用 DBFlow 生成的类。在 Kotlin 中编写这些类时,我们已经意识到我们在 Java 中拥有模型类和数据库类作为代码生成won't work

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

有趣的是,代码生成在第一次运行时就已经工作了——类就在那里并且也被 IDE 拾取。但是编译器不知何故找不到它们,这让我认为代码生成在构建过程中发生得太晚了。另一方面,如上所述,还有一些类未找到,它们不必对代码生成和/或注释处理做任何事情。

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

作为参考,我们应用程序的build.gradle 的相关部分如下所示 - 就像DBFlow documentation 建议的那样:

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
}

编辑:我发现每次对代码所做的更改都必须重新构建两次。如果我之前没有清理它,它会在第一次构建中正确编译,但根本没有拾取更改。

【问题讨论】:

  • 认为youtrack.jetbrains.com/issue/KT-8733 可能会修复此问题,但不幸的是,启用 generateStubs 后该修复似乎不起作用。
  • 我与 1.0.5-2 有完全相同的问题
  • 我也有类似的问题。如果我想生成签名的 apk,我需要将每个 buildType/flavor 组合编译两次,这使得自动构建更加不可用。
  • 您找到问题的原因了吗?我目前的项目遇到了非常相似的问题:(
  • 好像已经解决了。在对 Kotlin 和 Android Studio 插件进行了几次更新之后,我很少需要构建两次。我删除了生成存根,但似乎没有必要。

标签: android annotations kotlin


【解决方案1】:

如果你使用 kotlin 和 retrolambda,这可能会解决它:

me.tatarka:gradle-retrolambda:3.4.0

github gist

【讨论】:

  • 不,我们在迁移到 Kotlin 时放弃了 retrolambda。不管怎么说,还是要谢谢你! :)
  • 我正在将 kotlin 应用到使用 retrolambda 的旧项目中,因此可以像宣传的那样使用两者。
  • omg 这解决了我在使用 Kotlin 和 Android 时遇到的所有奇怪问题。惊人的。谢谢。
  • 我刚刚遇到了同样的问题。我必须构建两次才能显示 currentchanges。有点奇怪,总是出现上一轮编译的变化。您是否有指向确切问题的链接,我很好奇发生这种情况的原因。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多