Suche…


Einführung

Android unterstützt alle Java 7-Sprachfunktionen und einen Teil der Java 8-Sprachfunktionen, die je nach Plattformversion variieren. Auf dieser Seite werden die neuen Sprachfunktionen beschrieben, die Sie verwenden können, wie Sie Ihr Projekt ordnungsgemäß konfigurieren und alle bekannten Probleme, auf die Sie stoßen können.

Java 8-Funktionen mit Retrolambda

Mit Retrolambda können Sie Java 8-Code mit Lambda-Ausdrücken, Methodenreferenzen und try-with-resources-Anweisungen auf Java 7, 6 oder 5 ausführen. Er konvertiert Ihren kompilierten Java 8-Bytecode so, dass er auf einer älteren Java-Laufzeitumgebung ausgeführt werden kann.

Backported-Sprachfunktionen:

  • Lambda-Ausdrücke werden zurückportiert, indem sie in anonyme innere Klassen umgewandelt werden. Dies beinhaltet die Optimierung der Verwendung einer Singleton-Instanz für zustandslose Lambda-Ausdrücke, um eine wiederholte Objektzuordnung zu vermeiden. Methodenreferenzen sind im Wesentlichen nur Syntaxzucker für Lambda-Ausdrücke und werden auf dieselbe Weise zurückportiert.

  • Try-with-resources-Anweisungen werden Throwable.addSuppressed indem Aufrufe an Throwable.addSuppressed wenn die Zielcode-Version unter Java 7 liegt. Wenn die unterdrückten Ausnahmen protokolliert und nicht verschluckt werden sollen, erstellen Sie eine Funktionsanforderung, und wir erstellen sie konfigurierbar

  • Aufrufe von Objects.requireNonNull werden durch Aufrufe von Object.getClass wenn die Zielcode-Version unter Java 7 liegt. Die von JDK 9 generierten synthetischen Objects.requireNonNull verwenden Objects.requireNonNull , während in früheren JDK-Versionen Object.getClass .

  • Optional auch:

    1. Standardmethoden werden zurückportiert, indem die Standardmethoden als statische Methoden in eine Companion-Klasse (Schnittstellenname + "$") kopiert werden, die Standardmethoden in der Schnittstelle durch abstrakte Methoden ersetzt werden und indem allen Klassen, die diese Schnittstelle implementieren, die erforderlichen Methodenimplementierungen hinzugefügt werden .

    2. Statische Methoden für Schnittstellen werden zurückportiert, indem die statischen Methoden in eine Companion-Klasse (Schnittstellenname + "$") verschoben und alle Methodenaufrufe geändert werden, um den neuen Methodenstandort aufzurufen.

Bekannte Einschränkungen:

  • Es werden keine Java 8-APIs zurückportiert

  • Das Zurückschreiben von Standardmethoden und statischen Methoden auf Schnittstellen erfordert, dass alle zurückgeschalteten Schnittstellen und alle Klassen, die sie implementieren oder deren statische Methoden aufrufen, zusammen mit einer Ausführung von Retrolambda zurückportiert werden. Mit anderen Worten, Sie müssen immer einen sauberen Build durchführen. Backporting-Standardmethoden funktionieren auch nicht über Modul- oder Abhängigkeitsgrenzen hinweg.

  • invokedynamic , wenn ein zukünftiger JDK 8-Build die Generierung einer neuen Klasse für jeden invokedynamic Aufruf beendet. Retrolambda arbeitet so, dass es den Bytecode erfasst, den java.lang.invoke.LambdaMetafactory dynamisch generiert, sodass Optimierungen dieses Mechanismus Retrolambda möglicherweise brechen.

Retrolambda Gradle Plugin erstellt automatisch ein Android-Projekt mit Retrolambda. Die neueste Version finden Sie auf der Freigabeseite .

Verwendungszweck:

  1. Laden Sie jdk8 herunter und installieren Sie es
  2. Fügen Sie Folgendes zu Ihrem 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
    }
}

Bekannte Probleme:

  • Flusen schlagen bei Java-Dateien mit Lambdas fehl. Die Fusseln von Android verstehen die Java 8-Syntax nicht und versagen lautlos oder lautlos. Es gibt jetzt eine experimentelle Gabel, die das Problem behebt.

  • Durch die Verwendung der Google Play-Dienste schlägt Retrolambda fehl. Version 5.0.77 enthält einen mit Retrolambda nicht kompatiblen Bytecode. Dies sollte in neueren Versionen von Play Services behoben werden. Wenn Sie aktualisieren können, sollte dies die bevorzugte Lösung sein. Um dieses Problem zu umgehen, können Sie entweder eine frühere Version wie 4.4.52 verwenden oder -noverify zu den jvm-Argumenten hinzufügen.

retrolambda {
  jvmArgs '-noverify'
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow