Das Android-Gradle-Plug-in 3.0.0 und höher unterstützt alle Java 7-Sprachfunktionen und eine Teilmenge der Java 8-Sprachfunktionen, die je nach Plattformversion variieren. Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 oder 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 Java 8-Sprachfunktionen beschrieben, die Sie verwenden können, wie Sie Ihr Projekt richtig konfigurieren, um sie zu verwenden, und welche bekannten Probleme auftreten können. Im folgenden Video finden Sie eine Übersicht über die Sprachfunktionen von Java 8.
Das Android-Gradle-Plug-in bietet integrierte Unterstützung für die Verwendung bestimmter Java 8-Sprachfunktionen und Drittanbieterbibliotheken, die diese verwenden. Die Standard-Toolchain implementiert die neuen Sprachfunktionen, indem sie Bytecode-Transformationen (desugar) als Teil der D8/R8-Kompilierung von Klassendateien in DEX-Code ausführt, wie in Abbildung 1 dargestellt.
desugar-Bytecode-Transformationen.
Unterstützung für Java 8-Sprachfunktionen (Android-Gradle-Plug-in 3.0.0+)
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 Java 8-Sprachfunktionen verwendet (entweder im Quellcode oder über Abhängigkeiten), die Datei
build.gradleoderbuild.gradle.ktsdes Moduls wie unten gezeigt:
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" } }
Groovy
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 oder höher erstellen, werden nicht alle Java 8-Sprachfunktionen unterstützt. Die folgenden Sprachfunktionen sind auf allen API-Ebenen verfügbar:
| Java 8-Sprachfunktion | Hinweise |
|---|---|
| Lambda-Ausdrücke | Android unterstützt die Serialisierung von Lambda-Ausdrücken nicht. |
| Methodenreferenzen | |
| Typannotationen | Informationen zu Typannotationen sind nur zur Kompilierzeit verfügbar, nicht zur Laufzeit. Die Plattform unterstützt TYPE in API-Level 24 und niedriger, aber nicht ElementType.TYPE_USE oder ElementType.TYPE_PARAMETER.
|
| Standard- und statische Schnittstellenmethoden | |
| Wiederkehrende Anmerkungen |
Zusätzlich zu diesen Java 8-Sprachfunktionen wird in den Versionen 3.0.0 und höher des Android-Gradle-Plug-ins die Unterstützung für try-with-resources auf alle Android-API-Level ausgeweitet.
Desugar unterstützt weder MethodHandle.invoke noch MethodHandle.invokeExact.
Wenn Ihr Quellcode oder eine Ihrer 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 die Methoden invoke oder invokeExact möglicherweise nicht, auch 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 das nicht funktioniert, sollten Sie eine alternative Bibliothek verwenden, die die nicht unterstützten Methoden nicht verwendet.
Entzuckerung von Java 8+-Sprachfunktionen im Android-Gradle-Plug-in 3.0.0 und höher. Es werden keine zusätzlichen Klassen und APIs (z. B. java.util.stream.*) für die Verwendung in älteren Android-Releases verfügbar gemacht.
Die Unterstützung für die teilweise Entzuckerung von Java-APIs ist ab dem Android-Gradle-Plug-in 4.0.0 verfügbar, wie im folgenden Abschnitt beschrieben.
Unterstützung für Entzuckerung von Java 8+-APIs (Android-Gradle-Plug-in 4.0.0+)
Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 oder höher erstellen, wird die Unterstützung für die Verwendung einer Reihe von Java 8-Sprach-APIs erweitert, ohne dass ein Mindest-API-Level für Ihre App erforderlich ist. Mit dem Android-Gradle-Plug-in 7.4.0 oder höher sind auch eine Reihe von Java 11-Sprach-APIs mit der entzuckerten Bibliothek 2.0.0 oder höher verfügbar.
Diese zusätzliche Unterstützung für ältere Plattformversionen ist möglich, da das Plug-in ab Version 4.0.0 die Entzuckerungs-Engine so erweitert, dass auch Java-Sprach-APIs entzuckert werden. Sie können Standard-Sprach-APIs, die nur in neueren Android-Releases (z. B. java.util.streams) verfügbar waren, in Apps einbinden, die niedrigere Android-Versionen unterstützen.
Die folgenden APIs werden unterstützt, wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 oder höher erstellen:
- Sequenzielle Streams (
java.util.stream) - Eine Teilmenge von
java.time java.util.function- Kürzlich zu
java.util.{Map,Collection,Comparator}hinzugefügt - Optionals (
java.util.Optional,java.util.OptionalIntundjava.util.OptionalDouble) und einige neue Klassen - Einige Ergänzungen zu
java.util.concurrent.atomic(neue Methoden fürAtomicInteger,AtomicLongundAtomicReference) 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. eine Teilmenge des java.nio.file-Pakets.
Eine vollständige Liste der unterstützten APIs finden Sie unter Über Entzuckerung verfügbare Java 8+-APIs und Über Entzuckerung verfügbare Java 11+-APIs.
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 App ein. Beim Entzuckerungsprozess wird der Code Ihrer App so umgeschrieben, dass diese Bibliothek stattdessen zur Laufzeit verwendet wird. Der Quellcode, der in die separate DEX-Datei kompiliert wird, ist im GitHub-Repository desugar_jdk_libs verfügbar.
So aktivieren Sie die Unterstützung für diese Sprach-APIs auf allen Versionen der Android-Plattform:
- Aktualisieren Sie das Android-Gradle-Plug-in auf Version 4.0.0 oder höher.
- Fügen Sie der Datei
build.gradleoderbuild.gradle.ktsIhres App-Moduls Folgendes hinzu:
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") }
Groovy
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' }
Möglicherweise müssen Sie das vorherige Code-Snippet auch in die Datei build.gradle oder build.gradle.kts eines Bibliotheksmoduls einfügen, wenn:
Die Instrumentierungstests des Bibliotheksmoduls verwenden diese Sprach-APIs (entweder direkt oder über das Bibliotheksmodul oder seine Abhängigkeiten). So werden die fehlenden APIs für das instrumentierte Test-APK bereitgestellt.
Sie möchten Lint nur für das Bibliotheksmodul ausführen. So kann Lint gültige Verwendungen der Sprach-APIs erkennen und falsche Warnungen vermeiden.
Beachten Sie auch, dass die API-Entzuckerung mit der Minimierung kombiniert werden kann, aber nur, wenn der R8-Minimierer verwendet wird.
Versionen
In der folgenden Tabelle sind die Versionen der Java 8+-API-Bibliothek und die Mindestversion des Android-Gradle-Plug-ins aufgeführt, die die jeweilige Version unterstützt:
| Version | Mindestversion des Android-Gradle-Plug-ins |
|---|---|
| 1.1.9 | 4.0.0 |
| 1.2.3 | 7.3.0 |
| 2.0.3 | 7.4.0-alpha10 |
Weitere Informationen zu den Versionen der Java 8+-API-Bibliothek finden Sie in der Datei CHANGELOG.md im GitHub-Repository desugar_jdk_libs.