Плагин Android Gradle 3.0.0 и более поздние версии поддерживают все функции языка Java 7 и подмножество функций языка Java 8, которые различаются в зависимости от версии платформы. При создании приложения с использованием плагина Android Gradle 4.0.0 и более поздних версий вы можете использовать некоторые API языка Java 8, не требуя минимального уровня API для вашего приложения.
На этой странице описываются возможности языка Java 8, которые вы можете использовать, как правильно настроить свой проект для их использования, а также любые известные проблемы, с которыми вы можете столкнуться. Посмотрите следующее видео для обзора возможностей языка Java 8.
Плагин Android Gradle обеспечивает встроенную поддержку использования определенных языковых функций Java 8 и сторонних библиотек, которые их используют. Стандартная цепочка инструментов реализует новые языковые функции, выполняя преобразования байт-кода, называемые desugar
, как часть компиляции файлов классов D8/R8 в код DEX, как показано на рисунке 1.

desugar
.Поддержка функций языка Java 8 (плагин Android Gradle 3.0.0+)
Чтобы начать использовать поддерживаемые функции языка Java 8:
- Обновите плагин Android Gradle до версии 3.0.0 или выше.
- Для каждого модуля, использующего возможности языка Java 8 (в исходном коде или через зависимости), обновите файл
build.gradle
илиbuild.gradle.kts
модуля, как показано ниже:
Котлин
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
Круто
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
При создании приложения с использованием плагина Android Gradle 3.0.0 и выше плагин не поддерживает все функции языка Java 8. Следующие функции языка доступны на любом уровне API:
Возможности языка Java 8 | Примечания |
---|---|
Лямбда-выражения | Android не поддерживает сериализацию лямбда-выражений. |
Методические ссылки | |
Тип аннотаций | Информация об аннотации типа доступна только во время компиляции, а не во время выполнения. Платформа поддерживает TYPE в API уровня 24 и ниже, но не ElementType.TYPE_USE или ElementType.TYPE_PARAMETER . |
Методы интерфейса по умолчанию и статические | |
Повторяющиеся аннотации |
В дополнение к этим языковым возможностям Java 8 плагин Android Gradle версии 3.0.0 и выше расширяет поддержку try
-with-resources на все уровни API Android.
Desugar не поддерживает MethodHandle.invoke
или MethodHandle.invokeExact
. Если ваш исходный код или одна из зависимостей модуля использует один из этих методов, вам необходимо указать minSdkVersion 26
или выше. В противном случае вы получите следующую ошибку:
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
В некоторых случаях ваш модуль может не использовать методы invoke
или invokeExact
, даже если они включены в зависимость библиотеки. Чтобы продолжать использовать эту библиотеку с minSdkVersion 25
или ниже, включите сокращение кода , чтобы удалить неиспользуемые методы. Если это не сработает, рассмотрите возможность использования альтернативной библиотеки, которая не использует неподдерживаемые методы.
Язык Java 8+ поддерживает дешугаринг в плагине Android Gradle 3.0.0 и выше и не делает никакие дополнительные классы и API (такие как java.util.stream.*
) доступными для использования в более старых выпусках Android. Поддержка частичного дешугаринга Java API доступна в плагине Android Gradle 4.0.0 или выше, как описано в следующем разделе.
Поддержка API-дешугаринга Java 8+ (плагин Android Gradle 4.0.0+)
Если вы создаете свое приложение с помощью плагина Android Gradle 4.0.0 или выше, плагин расширяет поддержку использования ряда API языка Java 8 без требования минимального уровня API для вашего приложения. С плагином Android Gradle 7.4.0 или выше ряд API языка Java 11 также доступны с библиотекой desugared 2.0.0 или выше.
Эта дополнительная поддержка для старых версий платформы возможна, поскольку плагин 4.0.0 и выше расширяет движок дешугаринга, чтобы также дешугарировать API языка Java. Вы можете включить стандартные языковые API, которые были доступны только в последних выпусках Android (например, java.util.streams
), в приложения, которые поддерживают старые версии Android.
При создании приложения с использованием плагина Android Gradle 4.0.0 или выше поддерживается следующий набор API:
- Последовательные потоки (
java.util.stream
) - Подмножество
java.time
-
java.util.function
- Последние дополнения к
java.util.{Map,Collection,Comparator}
- Необязательные классы (
java.util.Optional
,java.util.OptionalInt
иjava.util.OptionalDouble
) и некоторые новые классы - Некоторые дополнения к
java.util.concurrent.atomic
(новые методы дляAtomicInteger
,AtomicLong
иAtomicReference
) -
ConcurrentHashMap
(с исправлениями ошибок для Android 5.0)
С плагином Android Gradle 7.4.0 или выше поддерживаются дополнительные API Java 11, такие как подмножество пакета java.nio.file
.
Полный список поддерживаемых API можно найти на страницах API Java 8+, доступных через дешугаринг, и API Java 11+, доступных через дешугаринг .
Для поддержки этих языковых API плагин компилирует отдельный файл DEX, содержащий реализацию отсутствующих API, и включает его в ваше приложение. Процесс дешугаринга переписывает код вашего приложения, чтобы вместо этого использовать эту библиотеку во время выполнения. Исходный код, скомпилированный в отдельный файл DEX, доступен в репозитории desugar_jdk_libs GitHub.
Чтобы включить поддержку этих языковых API в любой версии платформы Android:
- Обновите плагин Android Gradle до версии 4.0.0 (или выше).
- Включите следующее в файл
build.gradle
илиbuild.gradle.kts
вашего модуля приложения :
Котлин
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled = true } compileOptions { // Flag to enable support for the new language APIs // For AGP 4.1+ isCoreLibraryDesugaringEnabled = true // For AGP 4.0 // coreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") // For AGP 7.3 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3") // For AGP 4.0 to 7.2 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9") }
Круто
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled true } compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' // For AGP 7.3 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3' // For AGP 4.0 to 7.2 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' }
Обратите внимание, что вам также может потребоваться включить предыдущий фрагмент кода в файл build.gradle
или build.gradle.kts
библиотечного модуля, если:
Инструментированные тесты библиотечного модуля используют эти языковые API (напрямую или через библиотечный модуль или его зависимости). Это делается для того, чтобы отсутствующие API были предоставлены для вашего APK инструментированного теста.
Вы хотите запустить lint на модуле библиотеки изолированно. Это поможет lint распознать допустимые использования API языка и избежать ложных предупреждений.
Также следует отметить, что обессахаривание API можно сочетать с усадкой, но только при использовании усадочной машины R8.
Версии
В следующей таблице показаны версии библиотеки API Java 8+ и минимальная версия плагина Android Gradle, поддерживающая каждую версию:
Версия | Минимальная версия плагина Android Gradle |
---|---|
1.1.9 | 4.0.0 |
1.2.3 | 7.3.0 |
2.0.3 | 7.4.0-альфа10 |
Подробную информацию о версиях библиотеки API Java 8+ см. в файле CHANGELOG.md в репозитории GitHub desugar_jdk_libs
.