Das Android-Gradle-Plug-in 3.0.0 und höher unterstützt alle Java 7-Sprachfunktionen und einen Teil der Java 8-Sprachfunktionen, die je nach Plattformversion variieren. Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 und höher erstellen, können Sie einige Java 8-Sprach-APIs verwenden, ohne dass ein Mindest-API-Level für Ihre App erforderlich ist.
Auf dieser Seite werden die verfügbaren Java 8-Sprachfunktionen, die ordnungsgemäße Konfiguration Ihres Projekts für deren Verwendung sowie alle bekannten Probleme beschrieben, die auftreten können. Das folgende Video bietet einen Überblick über die Sprachfunktionen von Java 8.
Das Android-Gradle-Plug-in bietet integrierte Unterstützung für die Verwendung bestimmter Java 8-Funktionen und Drittanbieterbibliotheken, die diese verwenden. Die Standard-Toolchain implementiert die neuen Sprachfeatures durch Bytecode-Transformationen, die als desugar
bezeichnet werden, im Rahmen der D8/R8-Kompilierung von Klassendateien in DEX-Code, wie in Abbildung 1 dargestellt.
Unterstützung der Sprachfunktionen in Java 8 (Android Gradle-Plug-in 3.0.0 oder höher)
So verwenden Sie die unterstützten Java 8-Sprachfunktionen:
- Aktualisieren Sie das Android-Gradle-Plug-in auf Version 3.0.0 oder höher.
- Aktualisieren Sie für jedes Modul, das Funktionen der Java 8-Sprache verwendet (entweder im Quellcode oder über Abhängigkeiten), wie unten gezeigt die Datei
build.gradle
oderbuild.gradle.kts
des Moduls:
Kotlin
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
Groovig
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 3.0.0 und höher erstellen, unterstützt das Plug-in nicht alle Java 8-Sprachfunktionen. Die folgenden Sprachfunktionen sind auf jeder API-Ebene verfügbar:
Sprachfunktion Java 8 | Hinweise |
---|---|
Lambda-Ausdrücke | Android unterstützt die Serialisierung von Lambda-Ausdrücken nicht. |
Methodenverweise | |
Typanmerkungen | Informationen zur Annotation des Typs sind nur während der Kompilierung verfügbar, nicht während der Laufzeit. Die Plattform unterstützt TYPE in API-Level 24 und niedriger, aber weder ElementType.TYPE_USE noch ElementType.TYPE_PARAMETER .
|
Standardmethoden und statische Schnittstellen | |
Wiederkehrende Anmerkungen |
Zusätzlich zu diesen Java 8-Sprachfunktionen erweitern die Android-Gradle-Plug-ins ab Version 3.0.0 die Unterstützung für
try
-with-resources auf alle Android API-Ebenen.
Desugar unterstützt weder MethodHandle.invoke
noch MethodHandle.invokeExact
.
Wenn Ihr Quellcode oder eine der Modulabhängigkeiten eine dieser Methoden verwendet, müssen Sie minSdkVersion 26
oder höher angeben. Andernfalls erhalten Sie die folgende Fehlermeldung:
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
In einigen Fällen verwendet Ihr Modul möglicherweise nicht die Methoden invoke
oder invokeExact
, selbst wenn sie in einer Bibliotheksabhängigkeit enthalten sind. Wenn Sie diese Bibliothek weiterhin mit minSdkVersion 25
oder niedriger verwenden möchten, aktivieren Sie die Codekomprimierung, um nicht verwendete Methoden zu entfernen. Wenn dies nicht funktioniert, sollten Sie eine alternative Bibliothek verwenden, die die nicht unterstützten Methoden nicht verwendet.
Sprachfunktionen für Java 8 und höher, die mit dem Android-Gradle-Plug-in 3.0.0 und höher entsudet werden. Es werden keine zusätzlichen Klassen und APIs (z. B. java.util.stream.*
) für ältere Android-Releases verfügbar gemacht.
Unterstützung für partielles Java API-Entsugaring ist über das Android Gradle-Plug-in 4.0.0 oder höher verfügbar, wie im folgenden Abschnitt beschrieben.
Unterstützung für das Entpacken der Java 8+ API (Android Gradle-Plug-in 4.0.0 oder höher)
Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 oder höher erstellen, erweitert dieses Plug-in die Unterstützung einer Reihe von APIs in der Java 8-Sprache, ohne dass ein Mindest-API-Level für Ihre App erforderlich ist. Ab Android Gradle-Plug-in 7.4.0 oder höher ist auch mit der Entwicklerbibliothek 2.0.0 oder höher eine Reihe von Java 11-Sprach-APIs verfügbar.
Diese zusätzliche Unterstützung für ältere Plattformversionen ist möglich, da die Entsugaring-Engine mit Plug-in 4.0.0 und höher auf Desugar-APIs für die Java-Sprache erweitert wird. Sie können APIs in Standardsprachen, die nur in den letzten Android-Releases (z. B. java.util.streams
) verfügbar waren, in Apps einbinden, die ältere Android-Versionen unterstützen.
Die folgenden APIs werden beim Erstellen Ihrer App mit dem Android-Gradle-Plug-in 4.0.0 oder höher unterstützt:
- Sequenzielle Streams (
java.util.stream
) - Eine Untergruppe von
java.time
java.util.function
- Kürzlich hinzugefügt:
java.util.{Map,Collection,Comparator}
- Optionale Werte (
java.util.Optional
,java.util.OptionalInt
undjava.util.OptionalDouble
) und einige neue Klassen - Einige Ergänzungen von
java.util.concurrent.atomic
(neue Methoden inAtomicInteger
,AtomicLong
undAtomicReference
) ConcurrentHashMap
(mit Fehlerkorrekturen für Android 5.0)
Mit dem Android-Gradle-Plug-in 7.4.0 oder höher werden zusätzliche Java 11 APIs unterstützt, z. B. ein Teil des java.nio.file
-Pakets.
Eine vollständige Liste der unterstützten APIs finden Sie unter APIs für Java 8 und höher, die über Desugaring verfügbar sind und APIs für Java 11 und höher, die über Desugaring verfügbar sind.
Zur Unterstützung dieser Sprach-APIs kompiliert das Plug-in eine separate DEX-Datei, die eine Implementierung der fehlenden APIs enthält, und fügt sie in Ihre Anwendung ein. Beim Entsugaring-Prozess wird der Code Ihrer Anwendung so umgeschrieben, dass stattdessen diese Bibliothek zur Laufzeit verwendet wird.
So aktivieren Sie die Unterstützung für diese Language APIs in jeder Version der Android-Plattform:
- Aktualisieren Sie das Android-Gradle-Plug-in auf Version 4.0.0 (oder höher).
- Fügen Sie Folgendes in die Datei
build.gradle
oderbuild.gradle.kts
Ihres App-Moduls ein:
Kotlin
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled = true } compileOptions { // Flag to enable support for the new language APIs // For AGP 4.1+ isCoreLibraryDesugaringEnabled = true // For AGP 4.0 // coreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") // For AGP 7.3 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3") // For AGP 4.0 to 7.2 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9") }
Groovig
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled true } compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' // For AGP 7.3 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3' // For AGP 4.0 to 7.2 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' }
In folgenden Fällen müssen Sie möglicherweise auch das vorherige Code-Snippet in die Datei build.gradle
oder build.gradle.kts
eines Bibliotheksmoduls einfügen:
Die instrumentierten Tests des Bibliotheksmoduls verwenden diese Sprach-APIs (entweder direkt oder über das Bibliotheksmodul oder seine Abhängigkeiten). Dadurch werden die fehlenden APIs für dein instrumentiertes Test-APK bereitgestellt.
Sie möchten Lint isoliert für das Bibliotheksmodul ausführen. Dies soll Lint dabei helfen, gültige Nutzungen der Language APIs zu erkennen und falsche Warnungen zu vermeiden.
Beachten Sie auch, dass das API-Entsugaring mit der Verkleinerung kombiniert werden kann, jedoch nur bei Verwendung des R8 Srinkers.
Versionen
Die folgende Tabelle zeigt die Versionen der API-Bibliothek für Java 8+ und die minimale Version des Android Gradle-Plug-ins, die die einzelnen Versionen unterstützt:
Version | Mindestversion des Android-Gradle-Plug-ins |
---|---|
1.1.9 | 4 |
1.2.3 | 7.3.0 |
2.0.3 | 7.4.0–Alpha10 |
Weitere Informationen zu den Versionen der API-Bibliothek für Java 8 und höher finden Sie in der Datei CHANGELOG.md im GitHub-Repository desugar_jdk_libs
.