Независимо от того, написан ли ваш исходный код на Java, Kotlin или на обоих языках, в нескольких местах вам необходимо выбрать версию JDK или Java для сборки.
Глоссарий
- Комплект разработки Java (JDK)
- В состав Java Development Kit (JDK) входят:
- Инструменты, такие как компилятор, профилировщик и создатель архивов. Они используются в фоновом режиме во время сборки вашего приложения.
- Библиотеки, содержащие API, которые можно вызывать из исходного кода на Kotlin или Java. Обратите внимание, что не все функции доступны на Android.
- Виртуальная машина Java (JVM) — это интерпретатор, который выполняет приложения Java. JVM используется для запуска интегрированной среды разработки Android Studio и инструмента сборки Gradle. JVM не используется на устройствах Android или эмуляторах.
- JetBrains Runtime (JBR)
- JetBrains Runtime (JBR) — это улучшенная версия JDK, распространяемая вместе с Android Studio. Она включает в себя ряд оптимизаций для использования в Studio и связанных продуктах JetBrains, но также может использоваться для запуска других Java-приложений.
Как выбрать JDK для запуска Android Studio?
Мы рекомендуем использовать JBR для запуска Android Studio. Он развертывается вместе с Android Studio и используется для тестирования Android Studio, а также включает улучшения для оптимального использования Android Studio. Чтобы это обеспечить, не устанавливайте переменную среды STUDIO_JDK .
Скрипты запуска Android Studio ищут JVM в следующем порядке:
- переменная среды
STUDIO_JDK - Каталог
studio.jdk(в дистрибутиве Android Studio) - Каталог
jbr(среда выполнения JetBrains) находится в дистрибутиве Android Studio. Рекомендуется. - переменная среды
JDK_HOME - переменная среды
JAVA_HOME - добавление исполняемого файла
javaв переменную средыPATH
Как мне выбрать, какой JDK будет использоваться для сборки Gradle?
Если вы запускаете Gradle с помощью кнопок в Android Studio, для запуска Gradle используется JDK, указанный в настройках Android Studio. Если вы запускаете Gradle в терминале, как внутри, так и вне Android Studio, переменная среды JAVA_HOME (если она установлена) определяет, какой JDK запускает скрипты Gradle. Если JAVA_HOME не установлена, используется команда java из переменной среды PATH .
Для достижения наиболее стабильных результатов убедитесь, что вы установили переменную среды JAVA_HOME и конфигурацию Gradle JDK в Android Studio на тот же самый JDK.
При выполнении сборки Gradle создает процесс, называемый демоном, для выполнения фактической сборки. Этот процесс можно использовать повторно, если сборки используют одну и ту же версию JDK и Gradle. Повторное использование демона сокращает время, необходимое для запуска новой JVM и инициализации системы сборки.
При запуске сборок с разными версиями JDK или Gradle создаются дополнительные демоны, потребляющие больше ресурсов процессора и памяти.
Настройка Gradle JDK в Android Studio
Чтобы изменить конфигурацию Gradle JDK в существующем проекте, откройте настройки Gradle через меню «Файл» (или «Android Studio» на macOS) > «Настройки» > «Сборка, выполнение, развертывание» > «Инструменты сборки» > «Gradle» . В раскрывающемся списке Gradle JDK доступны следующие параметры для выбора:
- Макросы, такие как
JAVA_HOMEиGRADLE_LOCAL_JAVA_HOME - Записи в таблице JDK в формате
vendor-version, напримерjbr-17, хранятся в файлах конфигурации Android. - Загрузка JDK
- Добавление конкретного JDK
- Локально обнаруженные JDK из каталога установки JDK по умолчанию в операционной системе.
Выбранный параметр сохраняется в параметре gradleJvm в файле .idea/gradle.xml проекта, и для запуска Gradle через Android Studio используется разрешение пути к JDK.

Макросы позволяют динамически выбирать путь к JDK проекта:
-
JAVA_HOME: использует переменную среды с тем же именем. -
GRADLE_LOCAL_JAVA_HOME: использует свойствоjava.homeиз файла.gradle/config.properties, которое по умолчанию соответствует среде выполнения JetBrains.
Выбранная версия JDK используется для запуска сборки Gradle и разрешения ссылок на API JDK при редактировании скриптов сборки и исходного кода. Обратите внимание, что указанная версия compileSdk дополнительно ограничит список доступных символов Java при редактировании и сборке исходного кода.
Убедитесь, что вы выбрали версию JDK, которая выше или равна версиям JDK, используемым плагинами, которые вы используете в сборке Gradle. Чтобы определить минимально необходимую версию JDK для плагина Android Gradle (AGP), см. таблицу совместимости в примечаниях к выпуску .
Например, плагин Android Gradle версии 8.x требует JDK 17. Если вы попытаетесь запустить сборку Gradle, использующую эту версию, с более ранней версией JDK, появится сообщение следующего вида:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /usr/local/buildtools/java/jdk
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changing `org.gradle.java.home` in `gradle.properties`.
Какие Java API я могу использовать в своем исходном коде на Java или Kotlin?
Приложение Android может использовать некоторые API, определенные в JDK, но не все. Android SDK определяет реализации многих функций Java-библиотек в рамках доступных API. Свойство compileSdk указывает, какую версию Android SDK использовать при компиляции исходного кода Kotlin или Java.
Котлин
android {
...
compileSdk = 36
}
Классный
android {
...
compileSdk 36
}
Каждая версия Android поддерживает определённую версию JDK и подмножество доступных Java API. Если вы используете Java API, доступный в compileSdk , который недоступен в указанном minSdk , вы можете использовать этот API в более ранней версии Android с помощью процесса, известного как десахаризация . Список поддерживаемых API см. в разделе «API Java 11+, доступные через десахаризацию» .
Используйте эту таблицу, чтобы определить, какие версии Java поддерживаются каждым API Android, и где найти подробную информацию о доступных API Java.
| Android | Java | Поддерживаемые функции API и языка программирования. |
|---|---|---|
| 14 (API 34) | 17 | Основные библиотеки |
| 13 (API 33) | 11 | Основные библиотеки |
| 12 (API 32) | 11 | Java API |
| 11 и ниже | версии Android |
Какой JDK компилирует мой исходный код Java?
В состав Java Toolchain JDK входит компилятор Java, используемый для компиляции любого исходного кода Java. Этот JDK также запускает javadoc и модульные тесты во время сборки.
По умолчанию используется тот же JDK, что и для запуска Gradle. Если вы используете версию по умолчанию и запускаете сборку на разных машинах (например, на локальном компьютере и на отдельном сервере непрерывной интеграции), результаты сборки могут отличаться в зависимости от используемых версий JDK.
Для создания более согласованной сборки можно явно указать версию цепочки инструментов Java. Указание этой версии:
- Находит совместимую версию JDK в системе, где выполняется сборка.
- Если совместимая версия JDK отсутствует (и определен механизм разрешения цепочки инструментов), загружает её.
- Предоставляет доступ к Java API инструментария для вызовов из исходного кода.
- Компилирует исходный код Java, используя соответствующую версию языка Java.
- Задает значения по умолчанию для
sourceCompatibilityиtargetCompatibility.
Мы рекомендуем всегда указывать цепочку инструментов Java и либо убедиться, что указанный JDK установлен, либо добавить средство разрешения цепочки инструментов в процесс сборки.
Вы можете указать набор инструментов независимо от того, написан ли ваш исходный код на Java, Kotlin или на обоих языках. Укажите набор инструментов на верхнем уровне файла build.gradle(.kts) вашего модуля.
Укажите версию инструментария Java следующим образом:
Котлин
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Классный
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Это работает, если ваш исходный код написан на Kotlin, Java или их комбинации.
Версия JDK, используемая в цепочке инструментов, может совпадать с версией JDK, используемой для запуска Gradle, но следует помнить, что они служат разным целям.
Какие возможности языка Java я могу использовать в своем исходном коде Java?
Свойство sourceCompatibility определяет, какие языковые возможности Java доступны во время компиляции исходного кода Java. Оно не влияет на исходный код Kotlin.
Укажите параметр sourceCompatibility в файле build.gradle(.kts) вашего модуля следующим образом:
Котлин
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Классный
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
Если не указано иное, по умолчанию используется версия инструментария Java . Если вы не используете инструментарий Java, то по умолчанию используется версия, выбранная плагином Android Gradle (например, Java 8 или выше).
Какие функции бинарного файла Java можно использовать при компиляции исходного кода на Kotlin или Java?
Свойства targetCompatibility и jvmTarget определяют версию формата классов Java, используемую при генерации байт-кода для скомпилированного исходного кода Java и Kotlin соответственно.
Некоторые возможности Kotlin существовали до добавления аналогичных возможностей Java. Ранним компиляторам Kotlin приходилось создавать собственные способы представления этих возможностей. Некоторые из этих возможностей позже были добавлены в Java. С появлением более поздних уровней jvmTarget компилятор Kotlin мог напрямую использовать возможности Java, что могло привести к повышению производительности.
Разные версии Android поддерживают разные версии Java. Вы можете воспользоваться дополнительными функциями Java, увеличив targetCompatibility и jvmTarget , но это может потребовать от вас также увеличения минимальной версии Android SDK , чтобы гарантировать доступность этой функции.
Обратите внимание, что targetCompatibility должно быть больше или равно sourceCompatibility . На практике значения sourceCompatibility , targetCompatibility и jvmTarget обычно должны совпадать. Вы можете установить их следующим образом:
Котлин
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Классный
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}
Если не указано иное, по умолчанию используются значения версии инструментария Java . Если вы не используете инструментарий Java, значения по умолчанию могут отличаться и вызывать проблемы при сборке. Поэтому мы рекомендуем всегда явно указывать эти значения или использовать инструментарий Java .