【问题标题】:What happens if minSdkVersion is below sourceCompatibility?如果 minSdkVersion 低于 sourceCompatibility 会发生什么?
【发布时间】:2019-07-01 16:05:53
【问题描述】:

我将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 会在运行时使应用程序崩溃吗?

【问题讨论】:

  • 我的问题是什么意思?
  • 所以如果我不使用 Jack 不会有任何问题吗?
  • 是的,我理解,但是如果库使用流,Android 会检测到并抛出编译时错误吗?
  • 德里克,我没有使用流。但是如果一个库使用它,Lint 会检测到它吗?
  • 还是不明白,butterknife 使用 Java 8 功能(通过错误消息明显),但是当我通过sourceCompatibility 启用 Java 8 功能时,minSdkVersion 时没有警告19 岁? butterknife 如何使用 Java 8 功能但不需要 minSdkVersion > 19?

标签: android java-8 build.gradle android-min-sdk


【解决方案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 support documentation

如果 Android Studio 检测到您的项目正在使用 Jack, Retrolambda 或 DexGuard,IDE 使用由 取而代之的是那些工具。但是,请考虑迁移到默认值 工具链。

现在,正如您所说,您正在使用流 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 error "NewApi ”。它表明您的代码中的某些内容不是最佳的或可能会崩溃。这可以解决您的应用在低 Android 版本设备上崩溃的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2021-11-22
    • 2010-12-02
    • 2019-07-06
    相关资源
    最近更新 更多