Recherche…


Introduction

Android prend en charge toutes les fonctionnalités de langage Java 7 et un sous-ensemble de fonctionnalités de langage Java 8 qui varient selon la version de la plate-forme. Cette page décrit les nouvelles fonctionnalités linguistiques que vous pouvez utiliser, comment configurer correctement votre projet pour les utiliser et tout problème connu.

Fonctionnalités Java 8 sous-ensemble avec Retrolambda

Retrolambda vous permet d'exécuter du code Java 8 avec des expressions lambda, des références de méthode et des instructions try-with-resources sous Java 7, 6 ou 5. Pour ce faire, il transforme votre bytecode compilé Java 8 afin qu'il puisse s'exécuter sur une ancienne version de Java.

Fonctionnalités de langue Backported:

  • Les expressions lambda sont exportées en les convertissant en classes internes anonymes. Cela inclut l'optimisation de l'utilisation d'une instance de singleton pour les expressions lambda sans état afin d'éviter une allocation d'objet répétée. Les références de méthode sont simplement du sucre de syntaxe pour les expressions lambda et elles sont de la même manière.

  • Les instructions try-with-resources sont backportées en supprimant les appels à Throwable.addSuppressed si la version du bytecode cible est inférieure à Java 7. Si vous souhaitez que les exceptions supprimées soient consignées au lieu d'être avalées, créez une demande de fonctionnalité et nous la ferons configurable

  • Objects.requireNonNull appels Objects.requireNonNull sont remplacés par des appels à Object.getClass si la version du bytecode cible est inférieure à Java 7. Les vérifications null synthétiques générées par JDK 9 utilisent Objects.requireNonNull , alors que les versions JDK antérieures utilisaient Object.getClass .

  • Éventuellement aussi:

    1. Les méthodes par défaut sont répliquées en copiant les méthodes par défaut dans une classe associée (nom d'interface + "$") en tant que méthodes statiques, en remplaçant les méthodes par défaut de l'interface par des méthodes abstraites et en ajoutant les implémentations de méthode nécessaires à toutes les classes implémentant cette interface .

    2. Les méthodes statiques sur les interfaces sont répliquées en déplaçant les méthodes statiques vers une classe associée (nom d'interface + "$") et en modifiant tous les appels de méthodes pour appeler le nouvel emplacement de méthode.

Limitations Connues:

  • Ne transfère pas les API Java 8

  • Le backporting des méthodes par défaut et des méthodes statiques sur les interfaces nécessite que toutes les interfaces backportées et toutes les classes les implémentent ou appellent leurs méthodes statiques à être backportées ensemble, avec une exécution de Retrolambda. En d'autres termes, vous devez toujours faire une construction propre. De plus, les méthodes par défaut de backporting ne fonctionneront pas sur les limites de module ou de dépendance.

  • Peut se briser si un futur build JDK 8 cesse de générer une nouvelle classe pour chaque appel invokedynamic . Retrolambda fonctionne de sorte qu'il capture le bytecode que java.lang.invoke.LambdaMetafactory génère dynamiquement, de sorte que les optimisations à ce mécanisme peuvent casser Retrolambda.

Retrolambda gradle plugin va automatiquement construire votre projet Android avec Retrolambda. La dernière version peut être trouvée sur la page des versions .

Usage:

  1. Téléchargez et installez jdk8
  2. Ajoutez ce qui suit à votre build.gradle
buildscript {
  repositories {
     mavenCentral()
  }

  dependencies {
     classpath 'me.tatarka:gradle-retrolambda:<latest version>'
  }
}

// Required because retrolambda is on maven central
repositories {
  mavenCentral()
}

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

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

Problèmes connus:

  • Lint échoue sur les fichiers java contenant des lambdas. La charpie d'Android ne comprend pas la syntaxe Java 8 et échouera silencieusement ou bruyamment. Il y a maintenant un fork expérimental qui corrige le problème.

  • L'utilisation de Google Play Services entraîne l'échec de Retrolambda. La version 5.0.77 contient un bytecode incompatible avec Retrolambda. Cela devrait être résolu dans les nouvelles versions des services de lecture, si vous pouvez mettre à jour, cela devrait être la solution préférée. Pour contourner ce problème, vous pouvez utiliser une version antérieure telle que 4.4.52 ou ajouter -noverify aux -noverify jvm.

retrolambda {
  jvmArgs '-noverify'
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow