Что происходит, если minSdkVersion ниже совместимости с источником? - PullRequest
0 голосов
/ 01 июля 2019

Я обновил 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'
}

Однако minSdkVersion19, но Java 8 требует API> = 26, если я не ошибаюсь.

Просто для теста, когда я пытаюсь использовать функцию Java 8, такую ​​как stream, компилятор выдает ошибку, как и ожидалось:

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

Проекты компилируются без ошибок, но не удастся ли просто повредить приложение во время выполнения на низкой версии Android, пытаясь использовать функции языка Java 8?

1 Ответ

0 голосов
/ 01 июля 2019

Однако minSdkVersion равен 19, но для Java 8 требуется API> = 26, если я не ошибаюсь.

Android Studio 3.0+ изначально поддерживает Java 8, а Джек использовался для обеспечения поддержки Java 8 в более ранних выпусках Android Studio.

Чтобы начать поддерживать 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 и apis выглядит следующим образом:

  • Лямбда-выражения : Любые. Обратите внимание, что Android не поддерживает сериализация лямбда-выражений.
  • Ссылки на методы : Любые.
  • Тип аннотации : Любой. Однако информация аннотации типа доступно во время компиляции, но не во время выполнения. Также платформа поддерживает TYPE на уровне API 24 и ниже, но не 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 ниже совместимости с источником?

Если вы намеренно используете какой-либо из перечисленных выше API в версиях min-sdk ниже, чем они поддерживали (или, в вашем случае, minSdkVersion ниже sourceCompatibility), это даст вам ошибка lint" NewApi ». Это указывает на то, что в вашем коде что-то неоптимальное или может произойти сбой Это ответит на сбой вашего приложения на устройствах с низкой версией Android.

...