Android
Java auf Android
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 anThrowable.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 konfigurierbarAufrufe von
Objects.requireNonNull
werden durch Aufrufe vonObject.getClass
wenn die Zielcode-Version unter Java 7 liegt. Die von JDK 9 generierten synthetischenObjects.requireNonNull
verwendenObjects.requireNonNull
, während in früheren JDK-VersionenObject.getClass
.Optional auch:
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 .
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 jedeninvokedynamic
Aufruf beendet. Retrolambda arbeitet so, dass es den Bytecode erfasst, denjava.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:
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'
}