Question "Pourquoi Apache Harmony" ou "Comment utiliser Java 8 sur Android"


La plupart d'entre nous ont déjà entendu parler des fonctionnalités intéressantes que Java 8 apportera, mais Android ne le supportera pas. Ceci est dû au fait que Google utilise Apache Harmony Pour Android. C'est ce qui nous empêche (les développeurs d'applications Android) d'améliorer notre code avec lambdas, les implémentations par défaut dans les interfaces, l'activation d'une chaîne et bien plus encore. Certes, nous allons gérer pendant un certain temps, mais si certaines bibliothèques que nous utilisons dans nos applications commencent à utiliser les fonctionnalités de Java 8? Pour autant que je sache, cela ne fonctionnera pas (corrigez-moi s'il vous plait). Cela crée une incompatibilité entre la norme-Java et Android-Java. Ce ne peut pas être ce que Google a l'intention, ou du moins je ne peux pas penser à une raison pour laquelle une entreprise, développant un système d'exploitation largement adopté, ne serait pas de rester en permanence avec un vieux Version Java.

Des questions:

  • Pourquoi utilisent-ils Apache Harmony?
  • Pourquoi ne peuvent-ils pas adopter une nouvelle version de Java?
  • S'ils ne veulent pas Oracle Java, pourquoi ne peuvent-ils pas utiliser un sous-ensemble de OpenJDK (licence noob ici)?
  • Connaissez-vous des plans pour mettre à jour la version Java utilisée?
  • Connaissez-vous un moyen d'utiliser les classes Java 8 sur les systèmes Android actuels?

64
2018-06-04 15:08


origine


Réponses:


Pourquoi utilisent-ils Apache Harmony?

Parce que Sun a refusé de fournir à Google une licence pour Sun (désormais Oracle) Java sous des conditions acceptables. Google et Sun ont négocié, mais ils ont fini par quitter le marché.

Nitpick: en fait, les bibliothèques Android ne sont pas Apache Harmony. Ils ont commencé par Harmony, mais les deux bases de données ont divergé. En outre, le projet Apache Harmony a été officiellement "retiré" en novembre 2011.

Pourquoi ne peuvent-ils pas adopter une nouvelle version de Java?

Premièrement, Android ne lance pas Java (tm). Il exécute un langage identique à Java avec une bibliothèque de classes fonctionnellement équivalente à sous-ensemble de la bibliothèque de classes Java (+ bibliothèques spécifiques à Android), sur une machine virtuelle avec un différent jeu d'instructions.

D'un point de vue technique, ils pourraient ... mais seulement s'ils mettent beaucoup d'efforts dans la mise en œuvre des fonctionnalités de langage Java 7 et Java 8, des fonctionnalités de bibliothèque, etc., pour la plate-forme Android.

METTRE À JOUR - Depuis Android 19 (KitKat) et Eclipse ADT 22.6, Android prend désormais en charge les extensions de langage Java 7; voir http://tools.android.com/recent/eclipseadt226preview

S'ils ne veulent pas Oracle Java, pourquoi ne peuvent-ils pas utiliser un sous-ensemble d'OpenJDK?

Je ne pense pas que le passage à OpenJDK changerait quelque chose. Oracle Java et OpenJDK sont les mêmes à 99,9%.

De toute façon, il peut y avoir des problèmes de licence et des problèmes juridiques connexes. (Et pour avoir une idée de cela, lisez le procès Oracle vs Google ... qui va faire appel.)

Plus probablement, Google ne voit pas assez de valeur commerciale pour contrecarrer l’effort (massif) qu’il faudrait pour changer, et la perturbation qu’elle causerait à l’écosystème Android… qui souffre déjà de problèmes de fragmentation.

Connaissez-vous des plans pour mettre à jour la version Java utilisée?

Non je ne Cela ne signifie pas qu'il n'y a pas de plans, mais s'ils existent, ils ne sont pas publics.

Connaissez-vous un moyen d'utiliser les classes Java 8 sur les systèmes Android actuels?

Vous pourriez les porter. Ou du moins, vous pourriez essayer les porter. (Certaines API Java ont une relation intime avec le côté code natif de la machine virtuelle Java ... et cela pourrait rendre problématique le portage.)


55
2018-06-04 15:24



Connaissez-vous un moyen d'utiliser les classes Java 8 sur les systèmes Android actuels?

Il y a quelques bibliothèques qui font le backport des parties de l'API Java 8 (voir le mettre à jour section ci-dessous pour la prise en charge native de ces API dans les dernières versions d'Android):

  • ThreeTenABP backport de Java 8 date et heure API optimisé pour Android
  • Prise en charge du flux est un backport du Java 8 java.util.function (interfaces fonctionnelles) et java.util.stream (flux) API pour les utilisateurs de Java 6 ou 7 avec des ajouts sélectionnés à partir de java.util.concurrent qui n'existait pas dans Java 6.

Et vous pouvez utiliser retrolambda (de même que gradle-retrolambda plugin) pour utiliser lambdas dans le développement Android.

METTRE À JOUR 

Cependant, à partir d’Android Studio 2.4 Preview 4 (associé au plugin Android 2.4.0-alpha4), il existe une prise en charge intégrée de certaines fonctionnalités du langage Java 8:

  • Expressions lambda
  • Références de méthode
  • Répétition des annotations

Les fonctionnalités mentionnées ci-dessus peuvent être utilisées avec n'importe quel niveau d'API Android.

Depuis l'API niveau 24, nous pouvons également utiliser des méthodes d'interface par défaut et statiques, ainsi que l'API Java 8 suivante:

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

Le niveau API 26 (Android O Preview) ajoute java.time Prise en charge de l'API.


12
2017-10-04 22:59



Mettre à jour.

Android prévoit d'utiliser OpenJDK. Peut-être parce qu'ils pensent comme vous et veulent utiliser les fonctionnalités de Java 8. Voir ce


5
2017-12-30 11:42