web-dev-qa-db-fra.com

"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 Java 8 apportera, mais Android ne le supportera pas. C'est parce que Google utilise Apache Harmony pour Android. C'est ce qui nous empêche (les 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) Nous allons sûrement gérer pendant un certain temps, mais que faire si certaines bibliothèques que nous utilisons dans nos applications commencent à utiliser Java 8 fonctionnalités? Pour autant que je sache, cela ne fonctionnera pas (veuillez me corriger en cas d'erreur) .Cela crée une incompatibilité entre Standard - Java et Android - Java. Ce ne peut pas être l'intention de Google, ou du moins je ne vois pas pourquoi une entreprise, développant un système d'exploitation largement adopté, ne voudrait pas rester en permanence avec un ancien Java.

Des questions:

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

Pourquoi utilisent-ils Apache Harmony?

Parce que Sun a refusé de fournir à Google une licence pour Sun (maintenant Oracle) Java selon des conditions acceptables. Google et Sun ont négocié, mais ils ont fini par s'éloigner de l'accord.

Nitpick: en fait, les bibliothèques Android Android ne sont pas Apache Harmony. Elles ont commencé comme basées sur Harmony, mais les deux bases de code ont divergé. De plus, le projet Apache Harmony a été officiellement "retiré" en novembre 2011.

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

Tout d'abord, Android n'exécute pas Java (tm). Il exécute un langage identique à Java avec une bibliothèque de classes qui est fonctionnellement équivalente à un subset de la bibliothèque de classes Java (+ bibliothèques spécifiques à Android), sur une machine virtuelle avec un jeu d'instructions différent.

D'un point de vue technique, ils pourraient ... mais seulement s'ils mettent beaucoup de travail à implémenter Java 7 et Java 8 fonctionnalités du langage, fonctionnalités de la bibliothèque , etc., pour la plate-forme Android.

[~ # ~] mise à jour [~ # ~] - À partir de Android 19 (KitKat) et Eclipse ADT 22.6 , Android prend désormais en charge les extensions Java 7 langues; voir http://tools.Android.com/recent/eclipseadt226preview

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

Je ne pense pas que le passage à OpenJDK changerait quoi que ce soit. Oracle Java et OpenJDK sont identiques à 99,9%).

Quoi qu'il en soit, 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 suffisamment de valeur commerciale pour contrer l'effort (massif) qu'il faudrait pour changer, et la perturbation que cela causerait à l'écosystème Android ... qui souffre déjà de problèmes de fragmentation.

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

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

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

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

55
Stephen C

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

Il existe quelques bibliothèques qui rétroportent des parties de Java 8 API (voir la section update ci-dessous pour la prise en charge native de ces API dans la dernière Android versions):

  • ThreeTenABP backport de Java 8 API de date et d'heure optimisé pour Android
  • Prise en charge de Stream est un backport de Java 8 Java.util.function (interfaces fonctionnelles) et Java.util.stream (streams) API pour les utilisateurs de Java 6 ou 7 complété par des ajouts sélectionnés de Java.util.concurrent qui n'existait pas en arrière Java 6.

Et vous pouvez utiliser retrolambda (avec gradle-retrolambda plugin) pour utiliser lambdas dans Android développement.

[~ # ~] mise à jour [~ # ~]

Cependant, à partir de Android Studio 2.4 Preview 4 (combiné avec Android plugin 2.4.0-alpha4), il existe un support intégré pour certains des Java 8 fonctionnalités du langage:

  • Expressions lambda
  • Références de méthode
  • Répéter les annotations

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

À partir de l'API niveau 24, nous pouvons également utiliser les méthodes d'interface par défaut et statique, ainsi que l'API suivante Java 8:

  • Java.util.stream
  • Java.util.function
  • Java.lang.FunctionalInterface

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

12
Idolon

Mise à jour.

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

5
Nikhil Kuriakose