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

时间:2019-07-01 16:05:53

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

我将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。

仅出于测试目的,当我尝试使用Java stream之类的Java 8功能时,编译器会显示预期的错误:

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

项目编译没有错误,但是黄油刀是否会在运行中以较低的Android版本(试图使用Java 8语言功能)使应用程序崩溃?

1 个答案:

答案 0 :(得分:-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使用Java提供的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 error NewApi ”。这表明代码中的某些内容不是最佳的,或者可能崩溃。这可以解决您的应用在Android版本较低的设备上崩溃的问题。