Java 8-Sprachfeatures und APIs verwenden

Das Android-Gradle-Plug-in 3.0.0 und höher unterstützt alle Java 7-Sprachfunktionen sowie eine Untergruppe der Java 8-Sprachfunktionen, die je nach Plattformversion variieren. Wann? zum Erstellen Ihrer App mit dem Android-Gradle-Plug-in 4.0.0 und höher verwenden, können Sie einige Java 8-Sprach-APIs verwenden, ohne dass ein Mindest-API-Level für Ihr

Auf dieser Seite werden die Java 8-Sprachfunktionen, die Sie verwenden können, sowie und Ihr Projekt für deren Verwendung konfigurieren. Weitere Informationen zu bekannten Problemen. Das folgende Video bietet einen Überblick über die Sprachfunktionen von Java 8.

Das Android-Gradle-Plug-in unterstützt die Verwendung bestimmter Java 8-Versionen Sprachfunktionen und Bibliotheken von Drittanbietern, die sie verwenden. Die Standard-Toolchain die neuen Sprachfunktionen implementiert, indem Bytecode-Transformationen mit der Bezeichnung desugar im Rahmen der D8/R8-Kompilierung Klassendateien in DEX-Code umwandeln, wie in Abbildung 1 dargestellt.

<ph type="x-smartling-placeholder">
</ph> Unterstützung der Java 8-Sprachfunktionen mit dem Bytecode „desugar“
    Transformationen <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Unterstützung von Java 8-Sprachfunktionen mit desugar Bytecode-Transformationen.

Unterstützung von Java 8-Sprachfunktionen (Android-Gradle-Plug-in 3.0.0 oder höher)

So nutzen Sie die unterstützten Java 8-Sprachfunktionen:

  1. Android-Gradle-Plug-in aktualisieren bis 3.0.0 oder höher.
  2. Für jedes Modul, das Java 8 verwendet, Sprachmerkmale (entweder im Quellcode oder über Abhängigkeiten) Aktualisieren Sie die build.gradle- oder build.gradle.kts-Datei 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"
    }
}

Cool

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 folgende Sprache Funktionen sind auf jeder API-Ebene verfügbar:

Java 8-Sprachfunktion Hinweise
Lambda-Ausdrücke Android unterstützt die Serialisierung von Lambda-Ausdrücke verwendet werden.
Methodenreferenzen  
Anmerkungen eingeben Informationen zu Typanmerkungen sind erst bei der Kompilierung verfügbar. nicht während der Laufzeit. Die Plattform unterstützt TYPE in API-Level 24 und niedriger, aber nicht ElementType.TYPE_USE oder ElementType.TYPE_PARAMETER
Standardmäßige und statische Schnittstellenmethoden  
Wiederholte Anmerkungen  

Zusätzlich zu diesen Java 8-Sprachfunktionen bietet das Android-Gradle-Plug-in 3.0.0 und höher erweitern den Support für <ph type="x-smartling-placeholder"></ph> try-with-resources auf alle Android API-Ebenen.

Desugar unterstützt keine MethodHandle.invoke oder MethodHandle.invokeExact Wenn Ihr Quellcode oder eine Ihrer Modulabhängigkeiten eine dieser Methoden verwendet, müssen Sie mindestens minSdkVersion 26 angeben. Andernfalls erhalten Sie die folgenden Fehler:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

In einigen Fällen verwendet dein Modul invoke oder invokeExact nicht auch wenn sie in einer Bibliotheksabhängigkeit enthalten sind. Zur weiteren Verwendung mit minSdkVersion 25 oder niedriger, Code verkleinern zum Entfernen nicht verwendeten Methoden. Sollte dies nicht funktionieren, können Sie eine alternative Bibliothek verwenden, nicht die nicht unterstützten Methoden verwendet.

Deugaring der Sprachfeatures von Java 8 und höher im Android-Gradle-Plug-in Plug-ins 3.0.0 und höher und erstellt keine zusätzlichen Klassen und APIs, (z. B. java.util.stream.*) zur Verwendung mit älteren Android-Releases verfügbar. Unterstützung für die teilweise Java API-Desugarierung ist über die Android-Gradle-Version verfügbar. Plug-ins 4.0.0 oder höher, wie im folgenden Abschnitt beschrieben.

Unterstützung für das API-Degugaring mit Java 8 und höher (Android-Gradle-Plug-in ab Version 4.0.0)

Wenn Sie Ihre App mit dem Android-Gradle-Plug-in ab Version 4.0.0 erstellen, erweitert die Unterstützung für die Verwendung einer Reihe von Java 8-Sprach-APIs ohne für Ihre App ein Mindest-API-Level erforderlich ist. Mit dem Android-Gradle-Plug-in 7.4.0 oder sind auch einige Java 11-Sprach-APIs verfügbar. Bibliothek 2.0.0 oder höher.

Diese zusätzliche Unterstützung für ältere Plattformversionen ist möglich, Ab 4.0.0 wird die Desugaring-Engine auch auf die Java-Sprache Desugar erweitert. APIs Sie können APIs für die Standardsprache hinzufügen, die bisher nur in folgenden Sprachen verfügbar waren: neuere Android-Releases (z. B. java.util.streams) in Apps, die ältere Versionen von Android.

Die folgenden APIs werden beim Erstellen Ihrer App mit Android unterstützt Gradle-Plug-in ab Version 4.0.0:

  • Sequenzielle Streams (java.util.stream)
  • Eine Teilmenge von java.time
  • java.util.function
  • Kürzlich hinzugefügte Elemente in java.util.{Map,Collection,Comparator}
  • Optionale (java.util.Optional, java.util.OptionalInt und java.util.OptionalDouble) und einige neue Kurse
  • Einige Ergänzungen zu java.util.concurrent.atomic (neue Methoden zu 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 APIs für Java ab Version 8, die durch Desugaring verfügbar sind und Über die Desugaring-Funktion 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 sie in Ihre App einbindet. Bei der Desugarierung wird der Code Ihrer App so umgeschrieben, dass diese Bibliothek stattdessen unter Laufzeit.

Um die Unterstützung dieser Sprach-APIs auf allen Android-Versionen zu aktivieren Plattform:

  1. Android-Gradle-Plug-in aktualisieren bis 4.0.0 (oder höher).
  2. Nehmen Sie Folgendes in Ihr App-Modul auf: Datei build.gradle oder build.gradle.kts:

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")
}

Cool

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 auch das vorherige Code-Snippet in eine Bibliothek einfügen. build.gradle- oder build.gradle.kts-Datei des Moduls, wenn:

  • Die instrumentierten Tests des Bibliotheksmoduls verwenden diese Sprach-APIs (entweder direkt oder über das Bibliotheksmodul oder dessen Abhängigkeiten). Dadurch wird Die fehlenden APIs werden für das instrumentierte Test-APK bereitgestellt.

  • Sie möchten Lint isoliert für das Bibliotheksmodul ausführen. Dies soll helfen, „Lint“ erkennt gültige Nutzungen der Sprach-APIs und verhindert, dass falsche Angaben gemacht werden Warnungen.

Beachten Sie außerdem, dass die API-Entugarierung mit der Verkleinerung kombiniert werden kann, mit dem R8-Schrumpfer.

Versionen

In der folgenden Tabelle sind die Versionen der API-Bibliothek für Java 8+ und der Mindestversion des Android-Gradle-Plug-ins, die die einzelnen Versionen 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

Details zu den Versionen der API-Bibliothek für Java 8+ finden Sie in der Datei CHANGELOG.md im GitHub-Repository desugar_jdk_libs.