Java 8-Sprachfeatures und APIs verwenden

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.

Unterstützung von Java 8-Sprachfunktionen mithilfe von „desugar“-Bytecode-Transformationen
Abbildung 1. Unterstützung von Java 8-Sprachfunktionen mithilfe von 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:

  1. Aktualisieren Sie das Android-Gradle-Plug-in auf Version 3.0.0 oder höher.
  2. Aktualisieren Sie für jedes Modul, das Java 8-Sprachfunktionen verwendet (entweder im Quellcode oder über Abhängigkeiten), die Datei build.gradle oder build.gradle.kts des 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.OptionalInt und java.util.OptionalDouble) und einige neue Klassen
  • Einige Ergänzungen zu java.util.concurrent.atomic (neue Methoden für 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. 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:

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