"Por qué Apache Harmony" o "Cómo usar Java 8 en Android"

La mayoría de nosotros ya hemos oído hablar de las características interesantes de Java 8, pero Android no lo soportará. Esto se debe a que Google utiliza Apache Harmony para Android. Esto es lo que nos mantiene (los desarrolladores de aplicaciones de Android) de mejorar nuestro código con lambdas, implementaciones por defecto en las interfaces, el cambio de una cadena y mucho más. Seguramente, vamos a manejar durante algún tiempo, pero ¿qué pasa si algunas bibliotecas que utilizamos en nuestras aplicaciones empiezan a utilizar Java 8 características? Por lo que sé, esto no funcionará (por favor, corrija si está equivocado). Esto crea incompatibilidad entre Standard -Java y Android- Java. No puede ser lo que Google pretende, o por lo menos no puedo pensar en una razón por la que una empresa, el desarrollo de un sistema operativo ampliamente adoptado, wan't permanecer permanentemente con una antigua versión de Java.

Preguntas:

  • ¿Por qué utilizan Apache Harmony?
  • ¿Por qué no pueden adoptar una versión más reciente de java?
  • Si no quieren Java de Oracle, ¿por qué no pueden usar un subconjunto de OpenJDK (noob de licencia aquí)?
  • ¿Conoces algún plan para actualizar la versión de Java utilizada?
  • ¿Conoces alguna forma de usar clases Java 8 en los sistemas Android actuales?

¿Por qué utilizan Apache Harmony?

Debido a que Sun se negó a proporcionar a Google una licencia para Sun (ahora Oracle) Java en términos aceptables. Google y Sun negociaron, pero terminaron alejándose del acuerdo.

Nitpick: de hecho, las bibliotecas de Android no son Apache Harmony. Comenzaron como basado en Harmony, pero las dos bases de código han divergido. Además, el proyecto Apache Harmony fue oficialmente "retirado" en noviembre de 2011.

¿Por qué no pueden adoptar una versión más reciente de java?

En primer lugar, Android no ejecuta Java ™. Ejecuta un lenguaje idéntico a Java con una biblioteca de clases que es funcionalmente equivalente a un subconjunto de la biblioteca de clases Java (+ bibliotecas específicas de Android), en una máquina virtual con un conjunto de instrucciones diferente .

Desde un punto de vista técnico, podrían … pero sólo si ponen mucho trabajo en la implementación de Java 7 y Java 8 características del lenguaje, características de la biblioteca, etc, para la plataforma Android.

ACTUALIZACIÓN – A partir de Android 19 (KitKat) y Eclipse ADT 22.6, Android ahora soporta las extensiones de lenguaje Java 7; Vea http://tools.android.com/recent/eclipseadt226preview

Si no quieren Java de Oracle, ¿por qué no pueden usar un subconjunto de OpenJDK?

No creo que cambiar a OpenJDK cambiara nada. Oracle Java y OpenJDK son 99,9% iguales.

De todos modos, puede haber licencias y cuestiones legales relacionadas. (Y para tener una idea de eso, lea sobre la demanda de Oracle contra Google … que va a apelar.)

Lo más probable es que Google no vea el valor comercial suficiente para contrarrestar el esfuerzo (masivo) que se necesitaría para cambiar, y la interrupción que causaría al ecosistema de Android … que ya sufre de problemas de fragmentación.

¿Conoces algún plan para actualizar la versión de Java utilizada?

No, no lo hago. No significa que no haya planes, pero si lo hay, no son públicos.

¿Conoces alguna forma de usar clases Java 8 en los sistemas Android actuales?

Usted podría portarlos. O por lo menos, usted podría intentar portarlos. (Algunas API de Java tienen una relación íntima con el lado de código nativo de la JVM … y eso podría hacer problemático el portar).

¿Conoces alguna forma de usar clases Java 8 en los sistemas Android actuales?

Hay algunas bibliotecas que backport partes de Java 8 API (ver la sección de actualización a continuación para el soporte nativo de estas API en las últimas versiones de Android):

  • Backport de ThreeTenABP de Java 8 fecha y hora API optimizada para Android
  • El soporte de flujo es un backport de la API java.util.function (interfaces funcionales) de Java 8 y de la API java.util.stream (streams) para usuarios de Java 6 o 7 complementados con adiciones seleccionadas de java.util.concurrent que no existían De nuevo en Java 6.

Y puede utilizar retrolambda (junto con gradle-retrolambda plugin) para utilizar lambdas en el desarrollo de Android.

ACTUALIZAR

Sin embargo, a partir de Android Studio 2.4 Preview 4 (combinado con el complemento de Android 2.4.0-alpha4) hay compatibilidad integrada con algunas de las características del lenguaje Java 8:

  • Expresiones lambda
  • Referencias de método
  • Repetición de anotaciones

Las funciones mencionadas anteriormente se pueden utilizar con cualquier nivel de API de Android.

Desde el nivel 24 de API también podemos usar métodos de interfaz predeterminados y estáticos, así como la siguiente API de Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface

El nivel API 26 (Android O Preview) añade java.time API java.time .

Actualizar.

Android está planeando utilizar el OpenJDK. Posiblemente porque están pensando como tú y quieren usar las características de Java 8. Vea esto

  • Android N Java8 java.time
  • No se puede abrir el almacén de claves en AndroidStudio - "Se han encontrado bytes de longitud redundantes"
  • Dx no admitido archivo de clase versión 52.0 ... al analizar com / ejemplo / test1 / BuildConfig.class
  • El paquete Eclipse ADT no funciona correctamente
  • Uso de expresiones lambda con interfaces no funcionales en Java
  • Cómo utilizar jackOptions para el proyecto de biblioteca de Android
  • Android muestra texto en una codificación incorrecta después de la actualización a Java 8
  • El tiempo de compilación de Android con jack es extremadamente lento
  • La expresión lambda traducida de Jack no utiliza una aproximación más eficiente cuando minSdkVersion se establece en 24
  • Cómo Jack (Java Android Compiler Kit) afectará a los desarrolladores de Scala
  • Cómo suprimir la advertencia "Se puede reemplazar con foreach"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.