如何在 minsdk <24 上将 Kotlin 与 Butterknife 10.1.0 一起使用?

How to use Kotlin with Butterknife 10.1.0 on minsdk <24?

我正在将我的 Android 项目迁移到 AndroidX 库。 Butterknife 10.x 改进了对它的支持,所以我认为使用它很好。我的项目是用 Kotlin (1.3.30) 制作的。

Butterknife >8 版本要求您像这样使用 Java8:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

这适用于 >=24 的 minsdk。而且在很大程度上它也适用于较低版本。但是当 Kotlin 编译为 Java 8 时,一些功能在 minsdk <24 上不起作用。例如我收到以下异常的那个。

java.lang.NoSuchMethodError: No static method hashCode(J)I in class Ljava/lang/Long; or its super classes (declaration of 'java.lang.Long' appears in /system/framework/core-libart.jar)

Long.hashCode() 是 Java 8 中的新 api,但在旧的 android 版本中不受支持。 问题通过告诉编译器使用 Java 6 解决了同样的问题,但是 butterknife 10.x 不支持,我需要 AndroidX.

我想这是一个很常见的问题,但我还没有找到解决办法。我该如何解决?

当你有 Kotlin android extensions 时,你真的不需要 Butterknife。 使用起来就简单多了。

像这样:

myTextView.text = "Hello World!"

问题与使用 Kotlin 1.3.30 有关(请参阅 This issue). I have temporarily fixed the issue by using Kotlin 1.3.21. In a future version of D8 also the static methods of Long and Char will be desugared Issue here。它已经修复,但需要一些时间才能达到 D8 的稳定版本。之后就不会了不再是一个问题。