Ya sea que tu código fuente esté escrito en Java, Kotlin o ambos, hay varios lugares en los que debes elegir una versión de JDK o del lenguaje Java para tu compilación.
Glosario
- Java Development Kit (JDK)
-
El Java Development Kit (JDK)
contiene lo siguiente:
- Herramientas, como un compilador, un generador de perfiles y un creador de archivos (se usan tras bambalinas durante la compilación para crear tu aplicación)
- Bibliotecas que contienen APIs a las que puedes llamar desde tu código fuente Kotlin o Java (ten en cuenta que no todas las funciones están disponibles en Android)
- La máquina virtual Java (JVM), un intérprete que ejecuta aplicaciones de Java (usas la JVM para ejecutar el IDE de Android Studio y la herramienta de compilación de Gradle) (la JVM no se usa en dispositivos Android ni en emuladores)
- JetBrains Runtime (JBR)
- El JetBrains Runtime (JBR) es un JDK mejorado que se distribuye con Android Studio. Incluye varias optimizaciones para usar en Studio y productos relacionados de JetBrains pero también se puede usar para ejecutar otras aplicaciones de Java.
¿Cómo elijo un JDK para ejecutar Android Studio?
Te recomendamos que uses JBR para ejecutar Android Studio. Se implementa con y se usa para probar Android Studio, y también incluye mejoras para un uso óptimo de Android Studio. Para asegurarte de esto, no configures la variable de entorno STUDIO_JDK.
Las secuencias de comandos de inicio de Android Studio buscan una JVM en el siguiente orden:
- Variable de entorno
STUDIO_JDK - Directorio
studio.jdk(en la distribución de Android Studio) - Directorio
jbr(JetBrains Runtime), en la distribución de Android Studio (es la opción recomendada) - Variable de entorno
JDK_HOME - Variable de entorno
JAVA_HOME - Ejecutable
javaen la variable de entornoPATH
¿Cómo elijo qué JDK ejecuta mis compilaciones de Gradle?
Si ejecutas Gradle con los botones de Android Studio, se usará el JDK configurado en los ajustes de Android Studio para ejecutar Gradle. Si ejecutas Gradle en una terminal, ya sea dentro o fuera de Android Studio, la variable de entorno JAVA_HOME (si está configurada) determina qué JDK ejecuta las secuencias de comandos de Gradle. Si JAVA_HOME no está configurada, usa el comando java en tu variable de entorno PATH.
Para obtener los resultados más coherentes, asegúrate de configurar tu JAVA_HOME
variable de entorno, y
la configuración de Gradle JDK en Android Studio en ese mismo
JDK.
Cuando ejecutas tu compilación, Gradle crea un proceso llamado daemon para realizar la compilación real. Este proceso se puede volver a usar, siempre y cuando las compilaciones usen la misma versión de JDK y Gradle. Volver a usar un daemon reduce el tiempo para iniciar una JVM nueva y para inicializar el sistema de compilación.
Si inicias compilaciones con diferentes versiones de JDK o Gradle, se crearán daemons adicionales, que consumirán más CPU y memoria.
Configuración de Gradle JDK en Android Studio
Para modificar la configuración de Gradle JDK del proyecto existente, abre la configuración de Gradle desde File (o Android Studio en macOS) > Settings > Build, Execution, Deployment > Build Tools > Gradle. El menú desplegable Gradle JDK contiene las siguientes opciones para seleccionar:
- Macros como
JAVA_HOMEyGRADLE_LOCAL_JAVA_HOME - Entradas de la tabla de JDK en formato
vendor-version, comojbr-17, que se almacenan en los archivos de configuración de Android - Descarga de un JDK
- Agrega un JDK específico
- JDK detectados de forma local desde el directorio de instalación de JDK predeterminado del sistema operativo
La opción seleccionada se almacena en la opción gradleJvm del archivo .idea/gradle.xml del proyecto, y su resolución de ruta de acceso de JDK se usa para ejecutar Gradle cuando se inicia a través de Android Studio.
Las macros permiten la selección dinámica de la ruta de acceso de JDK del proyecto:
JAVA_HOME: Usa la variable de entorno con el mismo nombre.GRADLE_LOCAL_JAVA_HOME: Usa la propiedadjava.homeen el archivo.gradle/config.properties, que se establece de forma predeterminada en JetBrains Runtime.
El JDK seleccionado se usa para ejecutar tu compilación de Gradle y resolver las referencias de la API de JDK cuando editas tus secuencias de comandos de compilación y el código fuente. Ten en cuenta que el compileSdk especificado restringirá aún más qué símbolos de Java estarán disponibles cuando edites y compiles tu código fuente.
Asegúrate de elegir una versión de JDK que sea superior o igual a las versiones de JDK que usan los complementos que usas en tu compilación de Gradle. Para determinar la versión mínima requerida de JDK para el complemento de Android para Gradle (AGP), consulta la tabla de compatibilidad en las notas de la versión.
Por ejemplo, el complemento de Android para Gradle versión 8.x requiere JDK 17. Si intentas ejecutar una compilación de Gradle que lo use con una versión anterior del JDK, se mostrará un mensaje como el siguiente:
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`.
¿Qué APIs de Java puedo usar en mi código fuente Java o Kotlin?
Una aplicación para Android puede usar algunas de las APIs definidas en un JDK, pero no todas. El SDK de Android define implementaciones de muchas funciones de la biblioteca de Java como parte de sus APIs disponibles. La propiedad compileSdk especifica qué versión del SDK de Android se debe usar cuando se compila el código fuente Kotlin o Java.
Kotlin
android {
...
compileSdk = 36
}
Groovy
android {
...
compileSdk 36
}
Cada versión de Android admite una versión específica del JDK y un subconjunto de sus APIs de Java disponibles. Si usas una API de Java que está disponible en
un compileSdk que no está disponible en el
minSdk especificado, es posible que puedas usar la API
en la versión anterior de Android a través de un proceso conocido como
expansión de sintaxis.
Consulta APIs de Java 11 y versiones posteriores disponibles con la expansión de sintaxis para ver las APIs compatibles.
Usa esta tabla para determinar qué versión de Java admite cada API de Android y dónde encontrar detalles sobre qué APIs de Java están disponibles.
| Android | Java | Funciones de lenguaje y API compatibles |
|---|---|---|
| 14 (API 34) | 17 | Bibliotecas principales |
| 13 (API 33) | 11 | Bibliotecas principales |
| 12 (API 32) | 11 | API de Java |
| 11 y versiones anteriores | Versiones de Android |
¿Qué JDK compila mi código fuente Java?
El JDK de la cadena de herramientas de Java contiene el compilador de Java que se usa para compilar cualquier código fuente Java. Este JDK también ejecuta javadoc y pruebas de unidades durante la compilación.
La cadena de herramientas usa de forma predeterminada el JDK que se usa para ejecutar Gradle. Si usas el valor predeterminado y ejecutas una compilación en diferentes máquinas (por ejemplo, tu máquina local y un servidor de integración continua independiente), los resultados de la compilación pueden diferir si se usan diferentes versiones de JDK.
Para crear una compilación más coherente, puedes especificar de forma explícita una versión de la cadena de herramientas de Java. Si especificas lo siguiente:
- Busca un JDK compatible en el sistema que ejecuta la compilación.
- Si no existe un JDK compatible (y se define un solucionador de cadena de herramientas), descarga uno.
- Expone las APIs de Java de la cadena de herramientas para las llamadas desde el código fuente.
- Compila la fuente Java con su versión del lenguaje Java.
- Proporciona valores predeterminados para
sourceCompatibilityytargetCompatibility.
Te recomendamos que siempre especifiques la cadena de herramientas de Java y te asegures de que esté instalado el JDK especificado o agregues un solucionador de cadena de herramientas a tu compilación.
Puedes especificar la cadena de herramientas, ya sea que tu código fuente esté escrito en Java, Kotlin o ambos. Especifica la cadena de herramientas en el nivel superior del archivo build.gradle(.kts) de tu módulo.
Especifica la versión de la cadena de herramientas de Java de la siguiente manera:
Kotlin
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Groovy
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Esto funciona si tu fuente es Kotlin, Java o una combinación de ambos.
La versión de JDK de la cadena de herramientas puede ser la misma que la del JDK que se usa para ejecutar Gradle, pero ten en cuenta que tienen propósitos diferentes.
¿Qué funciones de origen del lenguaje Java puedo usar en mi código fuente Java?
La propiedad sourceCompatibility determina qué funciones del lenguaje Java están disponibles durante la compilación de la fuente Java.
No afecta a la fuente Kotlin.
Especifica sourceCompatibility en el archivo build.gradle(.kts) de tu módulo de la siguiente manera:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
Si no se especifica, esta propiedad usa de forma predeterminada la versión de la cadena de herramientas de Java. Si no usas una cadena de herramientas de Java, se usará de forma predeterminada una versión elegida por el complemento de Android para Gradle (por ejemplo, Java 8 o versiones posteriores).
¿Qué funciones binarias de Java se pueden usar cuando compilo mi fuente Kotlin o Java?
Las propiedades targetCompatibility y jvmTarget determinan la versión del formato de clase Java que se usa cuando se genera el código de bytes para la fuente Java y Kotlin compilada, respectivamente.
Algunas funciones de Kotlin existían antes de que se agregaran las funciones equivalentes de Java.
Los compiladores de Kotlin anteriores debían crear su propia forma de representar esas funciones de Kotlin. Algunas de estas funciones se agregaron más tarde a Java.
Con niveles jvmTarget posteriores, el compilador de Kotlin podría usar directamente la función de Java, lo que podría generar un mejor rendimiento.
Las diferentes versiones de Android admiten diferentes versiones de Java. Puedes
aprovechar las funciones adicionales de Java aumentando
targetCompatibility y jvmTarget, pero esto podría obligarte a
aumentar también tu
versión mínima del SDK de Android para garantizar
que la función esté disponible.
Ten en cuenta que targetCompatibility debe ser mayor o igual que sourceCompatibility. En la práctica, sourceCompatibility, targetCompatibility y jvmTarget generalmente deben usar el mismo valor.
Puedes configurarlos de la siguiente manera:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}
Si no se especifican, estas propiedades usan de forma predeterminada la cadena de herramientas de Java versión. Si no usas una cadena de herramientas de Java, los valores predeterminados pueden diferir y causar problemas de compilación. Por lo tanto, te recomendamos que siempre especifiques estos valores de forma explícita o uses una cadena de herramientas de Java.