¿Es posible usar Java 8 para el desarrollo de Android?

609

Al buscar en la web, no está claro si Java 8 es compatible con el desarrollo de Android o no.

Antes de descargar / configurar Java 8, alguien puede señalarme cualquier documentación "oficial" que diga que Java 8 es o no compatible con el desarrollo de Android.

nPn
fuente
21
No sé sobre la declaración oficial, pero tengo Java 8 (edición: JDK 8) funcionando bien con Android SDK para mí. Windows 8.1 de 64 bits aquí.
Hoang Huynh
2
Ha habido una discusión en esta publicación ¿Cómo se relaciona la versión Java de Android con una versión Java SE?
Aboalnaga
2
@HoangHuynh puede usar JDK 6 o superior para el desarrollo de Android. Sin embargo, la compilación admite Java versión 6 (y 7 en el caso de KitKat). Creo que lo que el OP significa también es para la versión de Java (no JDK)
waqaslam
13
Java 8 es OFICIALMENTE compatible con Android N. android-developers.blogspot.com/2016/03/…
Jay
2
tal vez pronto: developer.android.com/preview/j8-jack.html
Ray Tayek

Respuestas:

189

java 8

Android admite todas las características de lenguaje Java 7 y un subconjunto de características de lenguaje Java 8 que varían según la versión de la plataforma.

Para comprobar qué características de Java 8 son compatibles

Utilice las funciones del lenguaje Java 8

Decidimos agregar soporte para las características del lenguaje Java 8 directamente en el conjunto actual de herramientas javac y dx, y desaprobar la cadena de herramientas Jack. Con esta nueva dirección, las herramientas y complementos existentes que dependen del formato de archivo de clase Java deberían continuar funcionando. En el futuro, las características del lenguaje Java 8 serán compatibles de forma nativa con el sistema de compilación de Android. Nuestro objetivo es lanzar esto como parte de Android Studio en las próximas semanas, y queríamos compartir esta decisión temprano con usted.

Future of Java 8 Language Feature Support en Android

Usuarios de Eclipse:

Para los desarrolladores antiguos que prefieren Eclipse, Google deja de admitir las herramientas para desarrolladores de Android Eclipse

si instaló Java 8 JDK, inténtelo, si aparece algún problema, intente configurar el compilador como 1.6 en Eclipse desde el menú de la ventana → PreferenciasJavaCompilador . Java 7 también funcionará:

Preferencias de Eclipse -> Java -> Compilador

Se requiere Java 7 o superior si está apuntando a Android 5.0 y superior.

instala múltiples JDK y prueba.

Ing. Samer T
fuente
2
¿Java 8 cambió la forma en que funciona el bytecode? Si no, debería estar bien usar cualquier versión de Java, teóricamente, siempre que se compile.
Ben Leggiero
66
la pregunta correcta es: ¿qué pasa si usa nuevas funciones en java 8 que no existen en java 7 para construir la aplicación de Android, está bien? para estar seguro, siga las instrucciones oficiales.
Ing. Samer T
12
@ BenC.R.Leggiero no hay un nuevo bytecode en Java 8, pero los significados y las estructuras de las instrucciones fueron cambiados stackoverflow.com/questions/28228450/… stackoverflow.com/questions/16143684/…
phuclv
17
No publique "Actualización N" en su respuesta. Vuelva a escribirlo para tener información actualizada. De lo contrario, en unos años será tan difícil obtener información de SO como los foros que reemplazó.
Aleksandr Dubinsky
1
La respuesta necesita ser actualizada. Java 8 será compatible con Android Studio 3.0 y Gradle Plugin 3.0.
рій Мазуревич
350

ACTUALIZACIÓN 2017/11/04: Android Studio 3.0 ahora tiene soporte nativo para Java 8. gradle-retrolambda ya no es necesario. Ver https://developer.android.com/studio/write/java8-support.html

El enlace anterior también incluye instrucciones de migración si está utilizando gradle-retrolambda. Respuesta original a continuación:


Android no es compatible con Java 8. Solo es compatible con hasta Java 7 (si tiene kitkat) y aún no tiene invoke Dynamic, solo la nueva sintaxis Sugar.

Si desea usar lambdas, una de las principales características de Java 8 en Android, puede usar gradle-retrolamba . Es una dependencia de construcción gradle que integra retrolambda, una herramienta que convierte el código de bytes de Java 8 de nuevo a Java 6/7. Básicamente, si configura el compilador en Android Studio para compilar el código de bytes de Java 8, lo que permite lambdas, lo convertirá de nuevo en código de bytes de Java 6/7, que a su vez se convertirá en código de bytes dalvik. Es un truco para si quieres probar algunas características de JDK 8 en Android en lugar de soporte oficial.

ekcr1
fuente
13
Fue un poco difícil hacer que funcionara, pero una vez que realmente seguí las instrucciones correctas funcionó muy bien. Nota para los usuarios de Eclipse: Eclipse no funciona bien con esto, sugiero migrar a Android Studio (voy a extrañar Eclipse, ¡pero así es como debe ser por ahora!)
Simon Forsberg
2
Nitpick: las cláusulas de captura múltiple de Java 7 NO son compatibles con Android.
csvan
11
Multi-catch es compatible, solo la función JDK7 no compatible con Android es prueba con recursos
Matthieu Harlé
12
Java 7 funciona con todas las versiones de Android. Una excepción: try-with-resourcesfunciona solo desde Kitkat.
Dmitry Zaytsev
2
@Simon André Forsberg (precaución: ¡enchufe descarado!): En cuanto a que no admite la API de transmisión Java 8, puede hacer uso de mi biblioteca en sourceforge.net/projects/streamsupport : aborda explícitamente el soporte para Android.
Stefan Zobel
99

De hecho, puede usar la gradle-retrolambadependencia de compilación de gradle para usar Java 8 para el desarrollo de Android.

A continuación se muestra la guía completa que he seguido recientemente para ejecutar expresiones lambda para el desarrollo de Android. La fuente original de esta guía se menciona al final.

En esta guía, se demostrará un método para incorporar algunas características de Java 8 a las herramientas de desarrollo de Android, específicamente para Eclipse IDE. Sin embargo, los pasos que se describirán a lo largo de esta guía también podrían adaptarse al nuevo entorno de desarrollo de Google, Android Studio. Se basa en la edición comunitaria del popular IntelliJ Idea IDE de JetBrains y Google lo actualizó recientemente a su versión 'beta' a principios de julio de 2014, un poco antes de que se escribiera esta guía. Eclipse seguirá siendo el entorno de desarrollo destacado, al menos por un tiempo, y teniendo en cuenta el hecho de que la mayoría de los proyectos de Android se han desarrollado utilizando Eclipse, un método para incorporar nuevas características de Java 8 como expresiones lambda en ADT parece ser bastante útil para los desarrolladores.

El desarrollo de Android se basa en una implementación de Java personalizada llamada Apache Harmony Project, que finalizó en 2011. La sintaxis de Java más utilizada en el desarrollo de Android es Java 6 (v1.6) y Java 7 (v1.7) también es parcialmente compatible con la edición KitKat (Android 4.4. +). Por lo tanto, las características de Java 8 como las expresiones lambda no se pueden usar directamente en el desarrollo de aplicaciones de Android sin aplicar algunos ajustes en las herramientas de desarrollo. Afortunadamente, estas construcciones son básicamente algunas mejoras de 'azúcar sintáctico' que brindan a los desarrolladores las deficiencias de cosas como 'clases anónimas' y pueden traducirse a clases Java 6 o Java 7.

Un enfoque reciente para traducir un código fuente de Java 8 a versiones inferiores de Java se llama RetroLambda . Esta biblioteca hace que los desarrolladores ejecuten código Java 8 con expresiones lambda en Java 7 o incluso inferiores. Desafortunadamente, RetroLambda no admite funciones de Java 8 que no sean expresiones lambda por ahora, pero el concepto de expresiones lambda es el mayor salto en la plataforma Java 8 y de todos modos es una gran herramienta para los desarrolladores de Android.

Los detalles sobre esta biblioteca se pueden encontrar en su página de GitHub:

https://github.com/orfjackal/retrolambda#getting-started

Además, un complemento de Gradle para RetroLambda creado por otro desarrollador permite implementar compilaciones basadas en Gradle en proyectos Java o Android. Sin embargo, el desarrollador solo menciona la integración de este complemento en el entorno de Android Studio. Los detalles se pueden encontrar en su página de GitHub:

https://github.com/evant/gradle-retrolambda

El uso de estas infraestructuras dentro de un entorno de desarrollo basado en Eclipse no puede abordarse directamente, pero es factible y se demostrará a lo largo de esta guía.

Preparación

Esta guía asume que el lector tiene una comprensión básica del desarrollo de Android y se basa en la versión ADT 22.6.2 porque la versión ADT reciente 23.0.2 parece tener problemas como la creación de carpetas de diseño. Los detalles sobre este problema se pueden encontrar en el siguiente enlace:

http://code.google.com/p/android/issues/detail?id=72591

Se darán pasos en esta guía para una máquina de desarrollo de Windows 8.1 de 64 bits , pero se pueden adaptar fácilmente a otras plataformas. El nuevo sistema de compilación Gradlese utilizará para los procesos de compilación / limpieza y también se proporcionará su procedimiento de instalación. Además, ambos JDK 8y JDK 7deben coexistir en la máquina de desarrollo. Los pasos dados a continuación deben seguirse para instalarlos:

  • Vaya a la página de vista previa de acceso temprano de JDK 8 http://jdk8.java.net
  • Descargue JDK 8u20 e instálelo. La instalación de JRE 8 no es necesaria y se puede omitir
  • Vaya a la última página de lanzamiento estable de JDK 7 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
  • Descargue JDK 7u65 e instálelo. La instalación de JRE 7 nuevamente no es necesaria y se puede omitir
  • Agregue la carpeta de inicio JDK 8 y la carpeta JDK 8 bina su %PATH%variable
  • Cree una nueva variable de entorno JAVA_HOMEcon el valor de la ruta de la carpeta de inicio de JDK 8
  • Cree una nueva variable de entorno JAVA8_HOMEnuevamente con el valor de la ruta de la carpeta de inicio de JDK 8
  • Cree una nueva variable de entorno JAVA7_HOMEcon el valor de la ruta de la carpeta de inicio de JDK 7
  • Abra una ventana de terminal y ejecute el java -versioncomando y verifique que Java 8 esté funcionando
  • Ejecute el javac -versioncomando en la misma ventana y verifique que el compilador Java JDK 8 también esté funcionando

Ahora, ADT-22.6.2 debe descargarse desde el siguiente enlace:

http://dl.google.com/android/adt/22.6.2/adt-bundle-windows-x86_64-20140321.zip

  • Descargue ADT y descomprima su contenido en una carpeta, por ej. D:\adt
  • Definir una nueva variable de entorno llamada ANDROID_HOME con el valor de la ruta de la carpeta de instalación de ADT, p. Ej.D:\adt\sdk
  • Agregue sus carpetas Andoid SDK Platform Toolsy Andoid SDK Tools, por ejemplo , D:\adt\sdk\toolsy D:\adt\sdk\platform-tools, a su %PATH%variable
  • Cree un acceso directo a Eclipse IDE si lo desea. Se encuentra debajo de la carpeta de instalación de ADT, por ej.D:\adt\eclipse
  • Ejecute Eclipse IDE y cree un espacio de trabajo, p. Ej. D:\adt\workspace
  • Haga clic en el Android SDK Managerbotón que se encuentra en la barra de herramientas.
  • Seleccionar Android SDK Build tools Rev. 19.1y Android Support Librarysolo. Deseleccione todo lo demás e instale estos dos paquetes.

Si todo va bien, ADT estará en funcionamiento.

La instalación de las siguientes herramientas también es muy recomendable:

  • Compatibilidad con Eclipse Kepler Java 8: hace que Eclipse reconozca las nuevas extensiones de sintaxis de Java 8 y te hace deshacerte de las molestias red dotsen tu editor de código Java. Puede instalarse a través Help -> Install New Softwarede Eclipse. Ingrese http://download.eclipse.org/eclipse/updates/4.3-P-builds/ en el Work withcampo y continúe instalándolo.

  • Nodeclipse / Enide Gradle: se utiliza principalmente para resaltar palabras clave del idioma Groovy. Groovy se utiliza como DSL para los scripts de compilación de Gradle. Este complemento se puede instalar a través de Eclipse Marketplace. Sin embargo, Eclipse dentro de ADT-22.6.2 no viene junto con Eclipse Marketplace Client. Por lo tanto, primero deberá instalar Eclipse Marketplace Clientmediante la Install New Softwareherramienta en Eclipse. Ingrese http //: download.eclipse.org/mpc/kepler/ en el Work withcampo y continúe instalándolo. Después de la instalación Eclipse Marketplace Client, es posible buscar Nodeclipse/Enide Gradleen el Eclipse Marketplace Cliente instalarlo.

  • Dispositivo virtual Genymotion: es un gran reemplazo del valor predeterminado Android Virtual Deviceque viene junto con ADT. AVD es molestamente molesto y sigue fallando sin razón. Genymotion te hace preparar los VD de Android usando CyanogenModimágenes ejecutadas por Oracle VirtualBox . Su licencia de usuario único es gratuita y se puede descargar desde http://www.genymotion.com . Solo se requiere un inicio de sesión y también se puede integrar en Eclipse. Los detalles se pueden encontrar en:

https://cloud.genymotion.com/page/doc/#collapse8

A continuación se muestra una captura de pantalla de un dispositivo virtual CyanogenMod basado en Android 4.3,

ingrese la descripción de la imagen aquí

Podría considerarse como un dispositivo Android totalmente compatible que se ejecuta en una computadora personal basada en x86 o x64. Para utilizar los servicios de Google como Google PlayStoreen este dispositivo virtual, una gappsimagen para la versión de Android que utiliza debe mostrarse en el dispositivo. Se gappspuede descargar una imagen adecuada para el dispositivo desde el sitio web de CyanogenMod:

http://wiki.cyanogenmod.org/w/Google_Apps

La instalación de Gradle es opcional, ya que también la proporciona el SDK de Android, pero se recomienda encarecidamente su instalación por separado. La instalación del mismo puede realizarse siguiendo estos pasos:

  • Vaya al sitio web de Gradle: http://www.gradle.org/

  • Hacer clic Downloads

  • En Previous Releaseselija la versión 1.10 y descargue gradle-1.10-all.zip o gradle-1.10-bin.zip
  • Descomprima su contenido en una carpeta, por ejemplo D:\adt\gradle
  • Defina una nueva variable de entorno llamada GRADLE_HOMEcon el valor de la ruta de su carpeta de instalación de Gradle, p. Ej.D:\adt\gradle
  • Agregue su carpeta de binarios Gradle, por ejemplo D:\adt\gradle\bin, a su %PATH%variable
  • Abra una ventana de terminal y ejecute el gradle -vcomando y verifique que esté funcionando correctamente. Si ha llegado a este punto con éxito, significa que está listo para crear su primera aplicación de Android con las funciones de Java 8.

Aplicación de demostración

Se creará una aplicación simple para demostrar el uso de las herramientas que se describieron en la sección anterior. Simplemente puede seguir los pasos que se detallan a continuación para obtener información sobre el uso de expresiones lambda en las Herramientas para desarrolladores de Android:

  • Ejecute Eclipse IDE y cree una nueva aplicación de Android seleccionando File -> New -> Other -> Android -> Android Application Project
  • Complete el formulario que aparece como se muestra a continuación:

ingrese la descripción de la imagen aquí

  • Simplemente haga clic en el Nextbotón en los siguientes formularios y haga clic en el Finishbotón en el último. Espere hasta que ADT termine de cargar el proyecto
  • Haga clic derecho en el proyecto y seleccione New -> Folder y nombrebuilders
  • Haga clic derecho en el gen (Generated Java Files) carpeta y elimínela. Gradle generará los mismos archivos para nosotros pronto y los agregaremos a la s build path. Thecarpeta del proyecto gen` creada por el constructor Ant predeterminado ya no es necesaria y los artefactos de esa carpeta quedarán obsoletos
  • Cree los siguientes archivos por lotes en el builders carpeta:

    • gradle_build.cmd
    • gradle_post_build.cmd
    • gradle_clean.cmd
  • Complete estos archivos por lotes de la siguiente manera:

gradle_build.cmd:

ingrese la descripción de la imagen aquí

gradle_post_build.cmd:

ingrese la descripción de la imagen aquí

gradle_clean.cmd:

ingrese la descripción de la imagen aquí

  • Anular selección Project -> Build Automatically opción de menú
  • Haga clic derecho en el proyecto y seleccione Properties -> Builders y anule la selección de todos los constructores predeterminados proporcionados por ADT
  • Haga clic en el Newbotón en la misma ventana y seleccione Programy haga clicOK
  • Aparecerá una nueva ventana de configuración del generador. Complete sus pestañas de la siguiente manera:

Main Pestaña de la nueva configuración del generador

ingrese la descripción de la imagen aquí

Refresh Pestaña de la nueva configuración del generador

ingrese la descripción de la imagen aquí

Environment Pestaña de la nueva configuración del generador

ingrese la descripción de la imagen aquí

Build Options Pestaña de la nueva configuración del generador

ingrese la descripción de la imagen aquí

  • Cree el segundo generador llamado Gradle_Post_Buildque utiliza gradle_post_build.cmdcomo su programa. Todas las demás configuraciones de este generador deben ser exactamente las mismas que las del generador creado anteriormente. Este constructor será responsable de copiar los artefactos creados por el proceso de compilación en la bincarpeta.
  • Cree el tercer generador llamado Gradle_Cleanerque utiliza gradle_clean.cmdcomo su programa. Solo la Run the builderconfiguración en la pestaña final debe establecerse como During a Clean. Todas las demás configuraciones de este generador deben ser exactamente iguales con el primer generador. Este constructor será responsable de limpiar los artefactos creados por el proceso de construcción como su nombre indica.

Nuevos constructores del HelloLambdaproyecto

ingrese la descripción de la imagen aquí

  • Haga clic derecho en el proyecto y seleccione Export
  • Seleccionar Android -> Generate Gradle Build Filesy hacer clicNext
  • Seleccione el proyecto en la siguiente ventana y haga clic en Finish
  • Vaya a la carpeta raíz de su proyecto y elimine los archivos gradlewy gradlew.bat. Eliminar también la gradlecarpeta
  • Vuelva a Eclipse y seleccione la Project -> Cleanopción de menú. Rellene el formulario que se muestra a continuación:

Clean Project Ventana

ingrese la descripción de la imagen aquí

  • Haga clic OKy espere hasta que se complete el proceso de limpieza.
  • Agregue el fragmento de código Java que figura a continuación justo después de la llamada a setContentViewfuncionar en su MainActivityclase:

ingrese la descripción de la imagen aquí

  • Cambie el comienzo del build.gradlearchivo hasta la sourceCompatibilitysección de la siguiente manera:

ingrese la descripción de la imagen aquí

  • Haga clic derecho en el proyecto y seleccione la Properties -> Java Compileropción y establezca todos los niveles de cumplimiento en Java 8. Esto hará que Eclipse reconozca nuevas construcciones Java 8 como expresiones lambda.
  • Haga clic Noen la ventana de notificación.
  • Haga clic derecho en el proyecto y seleccione Build project. Eclipse comenzará a construir el proyecto.

Proceso de construcción ingrese la descripción de la imagen aquí

  • Haga clic derecho en el proyecto y vaya a Properties -> Java Build Path. Agregue las siguientes carpetas a la ruta de compilación (también se muestra en la imagen a continuación):

    • build\source\buildConfig\debug
    • build\source\r\debug

ingrese la descripción de la imagen aquí

Eclipse ahora podrá reconocer R.javaybuildConfig.java archivos y no mostrará ninguno red dotsque denote errores relacionados con los archivos de recursos del proyecto.

  • Cree una nueva Run Configurationplataforma de destino para Android haciendo clic derecho en el proyecto y luego seleccionandoRun As -> Run Configurations . Por ejemplo, esta aplicación de demostración se ve como se muestra a continuación en Genymotion VD:

Aplicación HelloLambda

ingrese la descripción de la imagen aquí

Puede observar en la LogCatventana que el fragmento de código con una expresión lambda simple funciona correctamente

ingrese la descripción de la imagen aquí

Fuente: Uso de Java 8 Lambda Expressions en Android Developer Tools

Sufiyan Ghori
fuente
¿Pero podrá depurar este código usando un depurador de Android? Supongo que las pilas / números de línea no serían compatibles. Parece un gran inconveniente para desarrollar con Java 8 en Android.
Zombis
2
@ Zombies Sí, todavía puedes depurarlo. Todo funciona bien.
Korniltsev Anatoly
42

Siga este enlace para nuevas actualizaciones. Utilice las funciones del lenguaje Java 8

Vieja respuesta

A partir de la versión de vista previa de Android N, las características limitadas de soporte de Android de Java 8 ver Características del lenguaje Java 8

Para comenzar a utilizar estas funciones, debe descargar y configurar Android Studio 2.1 y el SDK de Android N Preview, que incluye la cadena de herramientas Jack necesaria y el complemento Android actualizado para Gradle. Si todavía no ha instalado el Android SDK N de vista previa, consulte creada para desarrollar para Android N .

Funciones de lenguaje Java 8 compatibles y API

Actualmente, Android no es compatible con todas las funciones de lenguaje Java 8. Sin embargo, las siguientes características ahora están disponibles al desarrollar aplicaciones dirigidas a Android N Preview:

Métodos de interfaz predeterminados y estáticos

Expresiones lambda (también disponible en API nivel 23 y más bajo)

Anotaciones repetibles

Referencias de métodos (también disponibles en API nivel 23 y versiones inferiores)

Hay algunas características adicionales de Java 8 que son compatibles con Android, puede ver detalles completos de las características del lenguaje Java 8

Actualizar

Nota: Android N basa su implementación de expresiones lambda en clases anónimas. Este enfoque les permite ser compatibles con versiones anteriores y ejecutables en versiones anteriores de Android. Para probar expresiones lambda en versiones anteriores, recuerde ir a su archivo build.gradle y establezca compileSdkVersion y targetSdkVersion en 23 o menos.

Actualización 2

Ahora, la versión estable de Android studio 3.0 admite bibliotecas Java 8 y características de lenguaje Java 8 (sin el compilador Jack).


fuente
No entendi algo. ¿Hay algún requisito sobre el minSdkVersion?
WindRider
Creo que solo las expresiones lambda son compatibles con versiones anteriores, otras características de Java 8 funcionarán solo en N (o en una versión futura). No he probado esto, pero esto es lo que entiendo de los documentos de Android. Entonces, para las características de Java 8, minSdkVersion es N, aparte de la expresión lambda
Entonces ... unos años más hasta que N se convierta en líder en el tablero. :(
WindRider
Por desgracia sí. o hasta que Android de alguna manera proporcione compatibilidad con versiones anteriores como lambda
1
@WindRider, puede usar minSdkVersion 15 y superior. Actualmente estoy usando minSdkVersion 17 en mi proyecto de Android con Lambdas y todo está funcionando.
YYamil
22

Sí, Android es compatible con Java 8 ahora (24.1.17)

Ahora es posible

Pero necesitará que la rom de su dispositivo se ejecute en java 1.8 y habilitar "jackOptions" para ejecutarla. Jack es el nombre del nuevo compilador de Android que ejecuta Java 8

https://developer.android.com/guide/platform/j8-jack.html

agregue estas líneas a build_gradle

    android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Java 8 parece ser el motor de Java en ejecución de Android Studio 2.0, pero aún no acepta la sintaxis de Java 8 después de comprobarlo, y ahora no puede elegir un compilador de Android Studio. Sin embargo, puede usar el complemento scala si necesita un mecanismo de programación funcional en su cliente Android.

ingrese la descripción de la imagen aquí

sivi
fuente
1
Scala sería muy pesado de empaquetar con el apk
TechSpellBound
Consulte esta solución para Android Studio 2.0 actualizado, ya que han realizado actualizaciones a las opciones de configuraciones limitadas.
Gaurav Sharma
19

Android usa un Java que se ramifica desde Java 6.

A partir de Android SDK versión 19, puede usar las funciones de Java 7 haciendo esto . No hay soporte completo para Java 8 (todavía).

chaqke
fuente
1
eres un salvavidas. ¿Sabes si también hay algo que implementaría probar con recursos de manera similar?
Galets
@galets todavía no hay manera, pero apostaría a que Google lo agregará en algún momento en el futuro. Información adicional, ver: stackoverflow.com/questions/16921337/…
chaqke
16

¡Native Java 8 llega a Android! ¡Finalmente!

elimine el complemento Retrolambda y el bloque retrolambda del archivo build.gradle de cada módulo:

Para deshabilitar Jack y cambiar a la cadena de herramientas predeterminada, simplemente elimine el bloque jackOptions del archivo build.gradle de su módulo

Para comenzar a utilizar las funciones de lenguaje Java 8 compatibles, actualice el complemento de Android a 3.0.0 (o superior)

A partir de Android Studio 3.0, las características del lenguaje Java 8 ahora son compatibles de forma nativa con Android:

  • Expresiones lambda
  • Referencias de métodos
  • Anotaciones de tipo (actualmente la información de anotación de tipo no está disponible en tiempo de ejecución, sino solo en tiempo de compilación);
  • Repetir anotaciones
  • Métodos de interfaz estáticos y predeterminados (en el nivel de API 24 o superior, sin soporte de ejecución instantánea aunque);

También desde el nivel mínimo de API 24 están disponibles las siguientes API de Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType (Clase)
  • java.lang.reflect.Method.isDefault ()

Agregue estas líneas al build.gradle de su módulo de aplicación para informar al proyecto del nivel de idioma:

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Deshabilite la compatibilidad con las características del lenguaje Java 8 agregando lo siguiente a su archivo gradle.properties :

android.enableDesugar=false

Ya terminaste! ¡Ahora puedes usar java8 nativo!

Dhaval Jivani
fuente
14

Android OFICIALMENTE admite Java 8 a partir de Android N.

Los anuncios de funciones están aquí , el anuncio del lenguaje Java 8 es:

Compatibilidad mejorada con el lenguaje Java 8 : nos complace llevar las funciones del lenguaje Java 8 a Android. Con el compilador Jack de Android, ahora puede usar muchas características populares del lenguaje Java 8, incluidas lambdas y más, en versiones de Android desde Gingerbread. Las nuevas características ayudan a reducir el código repetitivo. Por ejemplo, lambdas puede reemplazar las clases internas anónimas al proporcionar oyentes de eventos. Algunas características del lenguaje Java 8, como métodos predeterminados y estáticos, flujos e interfaces funcionales, ahora también están disponibles en N y superiores. Con Jack, esperamos seguir más de cerca el lenguaje Java mientras mantenemos la compatibilidad con versiones anteriores.

Arrendajo
fuente
Todavía está bastante defectuoso en esta fecha, por ejemplo, Instant Run no funciona con lambdas: si cambia algún código dentro de su función lambda, no tomará el cambio.
adriendenat
12

Podemos usar Java 8 usando:

  1. En build.gradle (Proyecto: myProject) agregue lo siguiente

    classpath 'me.tatarka:gradle-retrolambda:x.x.x' //x.x.x is recent version
  2. En build.gradle (Módulo: myModule) agregue lo siguiente

    apply plugin: 'me.tatarka.retrolambda'
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
Vishal Raj
fuente
1
¿Qué es diferente de la primera respuesta que recomendó retro lambda?
Maarten Bodewes
2
@MaartenBodewes Parece que señaló que se ha vuelto mucho más simple que la respuesta aceptada. Consulte medium.com/android-news/…
TechSpellBound
No lo uses El complemento tiene errores
Akshay Mukadam
11

ACTUALIZACIÓN 2020/01/17

Android Studio 4.0 incluye soporte para usar una serie de API de lenguaje Java 8, utilizando una técnica llamada desugaring, sin requerir un nivel mínimo de API para su aplicación:
https://developer.android.com/studio/preview/features#j8-desugar

El siguiente conjunto de API es compatible con esta versión:

  • Secuencias secuenciales ( java.util.stream)
  • Un subconjunto de java.time
  • java.util.function
  • Adiciones recientes a java.util.{Map,Collection,Comparator}
  • Opcionales ( java.util.Optional, java.util.OptionalIntyjava.util.OptionalDouble ) y algunos otros nuevos clases útiles con las API anteriores
  • Algunas adiciones a java.util.concurrent.atomic(nuevos métodos sobre AtomicInteger, AtomicLongy AtomicReference)
  • ConcurrentHashMap (con correcciones de errores para Android 5.0)

Para admitir estas API de lenguaje, D8 compila un archivo DEX de biblioteca independiente que contiene una implementación de las API faltantes y lo incluye en su aplicación. El proceso de desugaring reescribe el código de su aplicación para utilizar esta biblioteca en tiempo de ejecución.

Para habilitar la compatibilidad con estas API de idiomas, incluya lo siguiente en el build.gradlearchivo de su módulo :

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 {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

POSTE ORIGINAL DE 2017

Android Studio 3.0 comenzó a proporcionar soporte integrado para algunas de las características del lenguaje Java 8, que son:

  • Expresiones lambda
  • Referencias de métodos
  • Anotaciones de tipo (la información está disponible en tiempo de compilación, pero no en tiempo de ejecución)
  • Repetir anotaciones
  • Métodos de interfaz predeterminados y estáticos

También a partir del nivel de API 24, están disponibles las siguientes API de Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
  • java.lang.reflect.Method.isDefault()

Además de eso, el try-with-resourcessoporte se extendió a todos los niveles de API de Android.

Se promete que se agregarán más funciones de Java 8 en el futuro.

Para comenzar a usar las funciones de lenguaje Java 8 compatibles, actualice el complemento de Android a 3.0.0-alpha1 (o superior) y agregue lo siguiente al archivo build.gradle de su módulo:

android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Para obtener más detalles, visite:
https://developer.android.com/studio/write/java8-support.html

Ídolo
fuente
Lo que no entiendo es, ¿qué tiene que ver android studio con el soporte java8 (no tenía intellij antes) ?! ¿Eso significa que si uso gradle en la terminal para compilar el proyecto, no lo haré?
cesarferreira
1
@cesarferreira Debe actualizar el complemento de Android a la última versión (que está en este momento 2.4.0-alpha6). Por favor verifique el bloque de citas en la respuesta.
Idolon
Agregarlo al módulo (no a la aplicación) en el que estoy trabajando fue el truco. Agregar al módulo de la aplicación no ayudó.
Surekha
6

Camino fácil

Puede habilitar la compatibilidad con java 1.8 para el proyecto de Android.

  • Estructura abierta del proyecto

    • Ya sea presionando Ctrl + Shift + Alt + S

    • O File > Project Structure

  • Actualice la compatibilidad de origen y la compatibilidad de destino a 1.8 en el cuadro de diálogo Estructura del proyecto como se muestra (haga clic en Archivo> Estructura del proyecto).

imagen

O puedes usar gradle

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Proyecto de sincronización. ¡Y eso es!

Nota: La compatibilidad con Java 1.8 se puede habilitar para Android Studio 3.0.0 o superior. Consulte la documentación para leer más.

Khemraj
fuente
Esta solución funcionó para mí: stackoverflow.com/a/55467237/4698320
Däñish Shärmà
5

Cuando hice esta pregunta hace casi 2 años, la respuesta realmente fue "oficialmente" no, pero como lo señala la respuesta de ekcr1, puede obtener una de las características más esperadas (lambdas) para trabajar si usa retrolamba. En ese momento todavía estaba usando eclipse, ya que Android Studio estaba en modo de "vista previa", por lo que nunca seguí este camino.

Hoy, creo que la respuesta "oficial" sigue siendo negativa, y aunque la retrolamba todavía parece un buen camino, hay otra opción para aquellos que estén dispuestos a tomar una ruta algo "no oficial", a saber, Kotlin.

Hoy Kotlin llegó a 1.0.0. Para aquellos que no están familiarizados con Kotlin, se puede encontrar más información en su sitio web que se encuentra aquí:

https://kotlinlang.org

o mira este video utube de una charla dada por Jake Wharton

https://www.youtube.com/watch?v=A2LukgT2mKc

nPn
fuente
4

Últimas noticias:

Google anuncia que con Android N y Android Studio 2.1+, la plataforma admitirá Java 8. También se lanzó una versión estable de Studio 2.1.

Por fin podemos usar expresiones lambda. No más filtros de lista para el bucle. Horeeey

asozcan
fuente
4

Agregue esta configuración build.gradle y sincronice gradle:

android {
    ...
    defaultConfig {
        ...
        jackOptions {
            enabled true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // or
        //sourceCompatibility 1.8
        //targetCompatibility 1.8
    }
}
Ahmad Aghazadeh
fuente
1
Esta es la forma correcta de agregar soporte para Java 8 para proyectos de Android. La desventaja es que la ejecución instantánea no se ejecuta actualmente cuando el conector está habilitado.
Ionut Negru
No soporte completo.
Ahmad Aghazadeh
2

Google acaba de anunciar que Java 8 será compatible de forma nativa con Android y que la cadena de herramientas Jack dejará de ser válida:

Decidimos agregar soporte para las características del lenguaje Java 8 directamente en el conjunto actual de herramientas javac y dx, y desaprobar la cadena de herramientas Jack. Con esta nueva dirección, las herramientas y complementos existentes que dependen del formato de archivo de clase Java deberían continuar funcionando. En el futuro, las características del lenguaje Java 8 serán compatibles de forma nativa con el sistema de compilación de Android. Nuestro objetivo es lanzar esto como parte de Android Studio en las próximas semanas, y queríamos compartir esta decisión temprano con usted.

Más información aquí: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

stamanuel
fuente
2

Si. ¡Usaremos Java 8 pronto!

Decidimos agregar soporte para las características del lenguaje Java 8 directamente en el conjunto actual de herramientas javac y dx, y desaprobar la cadena de herramientas Jack. Con esta nueva dirección, las herramientas y complementos existentes que dependen del formato de archivo de clase Java deberían continuar funcionando. En el futuro, las características del lenguaje Java 8 serán compatibles de forma nativa con el sistema de compilación de Android. Nuestro objetivo es lanzar esto como parte de Android Studio en las próximas semanas, y queríamos compartir esta decisión temprano con usted.

https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

Ajay S
fuente
2

agregué esta línea al módulo lvl build gradel

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

yuvrajsinh
fuente
1

Escribí una respuesta similar a una pregunta similar sobre Stack Overflow, pero aquí hay parte de esa respuesta.

Android Studio 2.1:

La nueva versión de Android Studio (2.1) es compatible con las funciones de Java 8. Aquí hay un extracto de la publicación del blog de desarrolladores de Android :

... La versión Android Studio 2.1 incluye soporte para el nuevo compilador Jack y soporte para Java 8 .

...

Para usar las características del lenguaje Java 8 al desarrollar con la Vista previa de desarrollador N, debe usar el compilador Jack. El Asistente de nuevo proyecto [Archivo → Nuevo → Proyecto] genera las configuraciones correctas para proyectos que apuntan al N.


Antes de Android Studio 2.1:

Android aún no admite Java 1.8 (solo admite hasta 1.7), por lo que no puede utilizar las funciones de Java 8 como lambdas.

Esta respuesta da más detalles sobre la compatibilidad de Android Studio ; afirma:

Si desea usar lambdas, una de las principales características de Java 8 en Android, puede usar gradle-retrolamba

Si desea saber más sobre el uso gradle-retrolambda, esta respuesta brinda muchos detalles sobre cómo hacerlo .

Farbod Salamat-Zadeh
fuente
Hola farbod Estoy usando AndroidStudio 2.2.2 Mi "SDK Location"(esto está en una Mac FWIW) solo dice "/Users/me/Library/Android/sdk" ¿Estoy usando Java8? ¿Cómo usar Java8? ¡Gracias!
Fattie
1

Pensé que publicaría una respuesta actualizada para aquellos que buscan algo un poco más actual.

Actualmente, Android y Android Studio son compatibles con un subconjunto de características de Java 8. De acuerdo con la documentación de Android ubicada en su sitio web , Google dice:

La compatibilidad con las características del lenguaje Java 8 requiere un nuevo compilador llamado Jack. Jack solo es compatible con Android Studio 2.1 y superior. Entonces, si desea utilizar las características del lenguaje Java 8, debe usar Android Studio 2.1 para compilar su aplicación.

Si ya tiene instalado Android Studio, asegúrese de actualizar a la última versión haciendo clic en Ayuda> Buscar actualizaciones (en Mac, Android Studio> Buscar actualizaciones). Si aún no tiene el IDE instalado en su estación de trabajo, descargue Android Studio aquí.

Funciones de lenguaje Java 8 compatibles y API

Android no es compatible con todas las características del lenguaje Java 8. Sin embargo, las siguientes características están disponibles cuando se desarrollan aplicaciones dirigidas a Android 7.0 (nivel de API 24):

  • Métodos de interfaz estáticos y predeterminados Expresiones de Lambda (también disponible en API nivel 23 e inferior)
  • Anotaciones repetibles
  • Referencias de métodos (también disponibles en API nivel 23 y versiones inferiores)
  • Anotaciones de tipo (también disponible en el nivel 23 de API y versiones inferiores)

Además, las siguientes API de lenguaje Java 8 también están disponibles:

Reflexión y API relacionadas con el lenguaje:

  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.Method.isDefault () y API de Reflection asociadas con anotaciones repetibles, como AnnotatedElement.getAnnotationsByType (Class)

API de utilidad:

  • java.util.function
  • java.util.stream

Para usar las nuevas características del lenguaje Java 8, también debe usar la cadena de herramientas Jack . Esta nueva cadena de herramientas de Android compila fuentes de lenguaje Java en el código de bytes DEX legible por Android, tiene su propio formato de biblioteca .jack y proporciona la mayoría de las características de la cadena de herramientas como parte de una sola herramienta: reempaquetado, reducción, ofuscación y multidex.

Aquí hay una comparación de las dos cadenas de herramientas utilizadas para construir archivos DEX de Android:

Legacy javac toolchain:
    javac (.java  .class)  dx (.class  .dex)
    New Jack toolchain:
    Jack (.java  .jack  .dex)
BlackHatSamurai
fuente
1

Hice esta pregunta hace más de 3 años y obviamente las respuestas han cambiado con los años. Como muchos de los anteriores ya han respondido, desde hace algún tiempo, la respuesta se convirtió en . Nunca he actualizado la respuesta aceptada porque era la respuesta correcta en ese momento. (No estoy seguro de cuál es la política de desbordamiento de pila en eso)

Solo quería agregar otra respuesta para aquellos que todavía buscan este tema. A partir del 17/05/2017, Google también anunció que Kotlin también es un idioma oficial para el desarrollo de Android.

No he encontrado un comunicado de prensa oficial, pero vi algunas de las E / S de Google videos de donde se anunció. Aquí hay un enlace a un blog posterior por el equipo Kotlin sobre el anuncio.

nPn
fuente
1

Agregar lo siguiente solucionó el problema para mí (Android Studio 2.3.2):

build.gradle (Proyecto)

buildscript {
repositories {
    ...
    jcenter()
}
dependencies {
    ...
    classpath 'me.tatarka:gradle-retrolambda:3.4.0' // DEPENDENCY
    ...
   }
}

build.gradle (Módulo: aplicación)

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' //PLUGIN

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    } // SET JAVA VERSION
    ...
}
Ricardo
fuente
1

Un subconjunto de Java 8 es compatible ahora con Android Studio. Simplemente realice los ajustes de compatibilidad de origen y destino desde la ventana a continuación:

Archivo -> Estructura del proyecto

Ventana de ajuste

Se proporciona más información en el siguiente enlace.

https://developer.android.com/studio/write/java8-support.html

Fio
fuente
1

ACTUALIZACIÓN 2019/10/28

Android Studio 4.0 resuelve este problema .

El compilador D8 aplica un parche de las API nativas de Java 8 en su APK en el momento de la compilación y su aplicación usará ese código, en lugar de las API nativas, en tiempo de ejecución. El proceso se llama desugaring .

styler1972
fuente
0

Todas las soluciones anteriores no parecen funcionar en 2019 con el último Android Studio 3.4+ .

Descubrí una solución perfecta y actualizada para migrar o actualizar su proyecto de Android a Java 8 .

Solución: haga clic en Archivo -> Estructura del proyecto -> Módulos -> pestaña Propiedades .

Cambie la compatibilidad de origen y la compatibilidad de destino a 1.8 (Java 8)

ingrese la descripción de la imagen aquí

zackygaurav
fuente
-1

La forma más fácil de agregar compatibilidad con Java 8

 compileOptions {
    targetCompatibility = '1.8'
    sourceCompatibility = '1.8'
 }

Simplemente agréguelo en su archivo build.gradle.

Bora Savkar
fuente
respuesta duplicada, baja calidad
JanPl