-1

我升级butterknife到 10.1.0 会引发此错误:

Execution failed for task ':app:mergeDexDebug'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Failed to transform artifact 'butterknife-runtime.aar (com.jakewharton:butterknife-runtime:10.1.0)' to match attributes {artifactType=android-dex, dexing-is-debuggable=true, dexing-min-sdk=19}
      > Execution failed for DexingTransform: /Users/<REMOVED>/.gradle/caches/transforms-2/files-2.1/65b6816001722128222b6880d16907c6/jars/classes.jar.
         > Error while dexing.

所以我添加到 build.gradle:

compileOptions {
    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'
}

但是,它minSdkVersion是 19,但如果我没记错的话,Java 8 需要 API >= 26。

只是为了测试,当我尝试使用像stream编译器这样的 Java 8 功能时,会按预期显示错误:

Call requires API level 24 (current min is 19): java.util.Collection#stream

项目编译没有错误,但是在尝试使用 Java 8 语言功能的低 Android 版本上,butterknife 会在运行时使应用程序崩溃吗?

4

1 回答 1

-1

但是,minSdkVersion 是 19,但如果我没记错的话,Java 8 需要 API >= 26。

Android Studio 3.0+ 原生支持 Java 8,Jack 用于为早期的 Android Studio 版本提供 Java 8 支持。

要在您的项目中开始支持 Java 8,您应该在您的项目中添加以下内容build.gradle(我假设您已经在使用 Android Studio 3.0+)。

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
 }

注意:根据Android Java 8 支持文档

如果 Android Studio 检测到您的项目正在使用 Jack、Retrolambda 或 DexGuard,IDE 将使用这些工具提供的 Java 8 支持。但是,请考虑迁移到默认工具链。

现在,正如您所说的,您正在使用流 api,它仅在 Android 24+ 上受支持。

Java 8 特性和 API 的完整支持列表如下:

  • Lambda 表达式:任何。请注意,Android 不支持 lambda 表达式的序列化。
  • 方法参考:任何。
  • 类型注释:任何。但是,类型注释信息在编译时可用,但在运行时不可用。此外,平台支持 API 级别 24 及以下的 TYPE,但不支持 ElementType.TYPE_USE 或 ElementType.TYPE_PARAMETER。
  • 默认和静态接口方法:任何。
  • 重复注释:任何。
  • java.lang.annotation.Repeatable:API 级别 24 或更高。
  • AnnotatedElement.getAnnotationsByType(Class):API 级别 24 或更高。
  • java.util.stream:API 级别 24 或更高。
  • java.lang.FunctionalInterface:API 级别 24 或更高。
  • java.lang.reflect.Method.isDefault():API 级别 24 或更高。
  • java.util.function:API 级别 24 或更高。

如果 minSdkVersion 低于 sourceCompatibility 会发生什么?

如果您故意在低于其支持的 min-sdk 版本中使用上述任何一种 API,(或者在您的情况下,minSdkVersion 低于 sourceCompatibility),它将给您lint 错误NewApi ”。它表明您的代码中的某些内容不是最佳的或可能会崩溃。这可以解决您的应用在低 Android 版本设备上崩溃的问题。

于 2019-07-01T17:00:14.187 回答