Skip to content

Most visited

Recently visited

navigation

Usar funciones del lenguaje Java 8

Android Studio 3.0 y las versiones posteriores admiten todas las funciones del lenguaje Java 7 y un subconjunto de funciones del lenguaje Java 8 que varían según la versión de la plataforma. En esta página, se describen las funciones del lenguaje Java 8 que puedes usar, la manera de configurar tu proyecto correctamente para usarlas y los problemas conocidos que puedes experimentar.

Nota: Cuando se desarrollan apps para Android, el uso de funciones del lenguaje Java 8 es opcional. Puedes mantener los valores de compatibilidad de origen y destino de tu proyecto en Java 7, pero debes usar JDK 8 para la compilación.

Android Studio proporciona compatibilidad integrada para el uso de ciertas funciones del lenguaje Java 8 y bibliotecas de terceros que las usan. Como se muestra en la figura 1, el conjunto de herramientas predeterminadas implementa las funciones nuevas del lenguaje realizando transformaciones de código de bytes, con el nombre desugar, en el resultado del compilador javac. Ya no se admite Jack, y primero debes inhabilitarlo para poder usar la compatibilidad con Java 8, integrada al conjunto de herramientas predeterminadas.

Figura 1: Compatibilidad con funciones del lenguaje Java 8 mediante las transformaciones de código de bytes desugar.

Para comenzar a usar las funciones del lenguaje Java 8 compatibles, actualiza el complemento de Android a 3.0.0 (o versiones posteriores). Luego, para cada módulo que use funciones del lenguaje Java 8 (ya sea en su código fuente o a través de dependencias), agrega lo siguiente a su archivo build.gradle:

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
  }
}

Nota: Si Android Studio detecta que tu proyecto usa Jack, Retrolambda o DexGuard, el IDE usa la compatibilidad con Java 8 provista por esas herramientas. Sin embargo, considera realizar una migración al conjunto de herramientas predeterminadas.

Funciones y API admitidas del lenguaje Java 8

Android Studio no tiene compatibilidad con todas las funciones del lenguaje Java 8, pero se agregarán más en las versiones futuras del IDE. Según la versión de minSdkVersion que uses, algunas funciones y API ya se encuentran disponibles, como se describe en la tabla siguiente.

Función del lenguaje Java 8 minSdkVersion compatible
Expresiones lambda Cualquiera. Sin embargo, la serialización lambda es compatible únicamente cuando todos los valores capturados por lambda pueden serializarse.
Referencias de métodos Cualquiera.
Anotaciones de tipos Cualquiera. Sin embargo, la información de anotaciones de tipos se encuentra disponible en el momento de la compilación pero no en el tiempo de ejecución. Además, la plataforma es compatible con TYPE en el nivel de API 24 y versiones anteriores, pero no con ElementType.TYPE_USE o ElementType.TYPE_PARAMETER.
Métodos de interfaz predeterminados y estáticos Cualquiera.
Repetición de anotaciones Cualquiera.
API del lenguaje Java 8 minSdkVersion compatible
java.lang.annotation.Repeatable Nivel de API 24 o versiones posteriores.
AnnotatedElement.getAnnotationsByType(Class) Nivel de API 24 o versiones posteriores.
java.util.stream Nivel de API 24 o versiones posteriores.
java.lang.FunctionalInterface Nivel de API 24 o versiones posteriores.
java.lang.reflect.Method.isDefault() Nivel de API 24 o versiones posteriores.
java.util.function Nivel de API 24 o versiones posteriores.

Además de ofrecerse las funciones del lenguaje Java 8 y las API mencionadas anteriormente, en Android Studio 3.0 y las versiones posteriores se extiende la compatibilidad con try-with-resources para todos los niveles de la Android API.

Actualmente, desugar no es compatible con MethodHandle.invoke ni MethodHandle.invokeExact. Si tu código fuente o una de las dependencias de tu módulo usan uno de estos métodos, debes especificar minSdkVersion 26 o una versión posterior. De lo contrario, verás el siguiente error:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

En algunos casos, es posible que tu módulo no use los métodos invoke o invokeExact, aun cuando se encuentren incluidos en una dependencia de biblioteca. Por lo tanto, para seguir usando esa biblioteca con minSdkVersion 25 o versiones anteriores, habilita la reducción de código para quitar métodos no utilizados. Si eso no funciona, considera usar una biblioteca alternativa que no emplee los métodos incompatibles.

Realizar una migración al conjunto de herramientas predeterminadas

Si Android Studio detecta que tu proyecto usa Jack, Retrolambda o DexGuard, el IDE usa la compatibilidad con Java 8 provista por esas herramientas. Sin embargo, en comparación con el conjunto de herramientas predeterminadas, esas herramientas carecen de funcionalidad y compatibilidad. Por ello, sigue las instrucciones de esta sección para realizar la migración al conjunto de herramientas predeterminadas de Android Studio.

Realizar la migración desde Jack

El conjunto de herramientas Jack es obsoleto, de acuerdo con este anuncio. Si tu proyecto depende de Jack, debes realizar la migración para usar la compatibilidad con Java 8 integrada al conjunto de herramientas predeterminadas de Android Studio. El uso del conjunto de herramientas predeterminadas también incluye compatibilidad con bibliotecas de terceros que usen funciones del lenguaje Java 8, Instant Run y herramientas que dependan de archivos .class intermedios.

Para inhabilitar Jack y realizar el cambio al conjunto de herramientas predeterminadas, simplemente quita el bloque jackOptions del archivo build.gradle de tu módulo:

android {
    ...
    defaultConfig {
        ...
        // Remove this block.
        jackOptions {
            enabled true
            ...
        }
    }

    // Keep the following configuration in order to target Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Realizar la migración desde Retrolambda

En comparación con el conjunto de herramientas predeterminadas de Android Studio, Retrolambda no tiene compatibilidad con bibliotecas de terceros que usen funciones del lenguaje Java 8. Para realizar la migración al conjunto de herramientas predeterminadas, quita la dependencia de Retrolambda de tu archivo build.gradle de nivel de proyecto:

buildscript {
  ...
   dependencies {
      // Remove the following dependency.
      classpath 'me.tatarka:gradle-retrolambda:<version_number>'
   }
}

Quita también el complemento de Retrolambda y el bloque retrolambda del archivo build.gradle de cada módulo:

// Remove the following plugin.
apply plugin: 'me.tatarka.retrolambda'
...
// Remove this block after migrating useful configurations.
retrolambda {
    ...
    // If you have arguments for the Java VM you want to keep,
    // move them to your project's gradle.properties file.
    jvmArgs '-Xmx2048m'
}

Inhabilitar la compatibilidad con funciones del lenguaje Java 8

Si experimentas problemas relacionados con la compatibilidad con funciones del lenguaje Java 8, puedes inhabilitarla agregando lo siguiente a tu archivo gradle.properties:

android.enableDesugar=false

Para ayudarnos a mejorar la compatibilidad con Java 8, presenta un error.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Seguir a Google Developers en WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)