Java 8-Sprachfeatures und APIs verwenden

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 Java 8-Features mit „desugar“-Bytecode-Transformationen
Abbildung 1: Unterstützung der Java 8-Features mit desugar-Bytecode-Transformationen.

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:

  1. Aktualisieren Sie das Android-Gradle-Plug-in auf Version 3.0.0 oder höher.
  2. 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 oder build.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 und java.util.OptionalDouble) und einige neue Klassen
  • Einige Ergänzungen von java.util.concurrent.atomic (neue Methoden in AtomicInteger, AtomicLong und AtomicReference)
  • 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:

  1. Aktualisieren Sie das Android-Gradle-Plug-in auf Version 4.0.0 (oder höher).
  2. Fügen Sie Folgendes in die Datei build.gradle oder build.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.