Utilizzo di funzionalità e API del linguaggio Java 8

Il plug-in Android per Gradle 3.0.0 e versioni successive supporta tutte le funzionalità del linguaggio Java 7 e un sottoinsieme di caratteristiche del linguaggio Java 8 che variano in base alla versione della piattaforma. Quando creando la tua app utilizzando il plug-in Android per Gradle 4.0.0 e versioni successive, puoi utilizzare alcune API del linguaggio Java 8 senza richiedere un livello API minimo per il dell'app.

In questa pagina vengono descritte le funzionalità del linguaggio Java 8 che puoi utilizzare, come configurare il progetto per utilizzarle ed eventuali problemi noti che potresti riscontrare. Guarda il seguente video per una panoramica delle funzionalità del linguaggio Java 8.

Il plug-in Android Gradle fornisce supporto integrato per l'utilizzo di determinate versioni di Java 8 il linguaggio naturale e le librerie di terze parti che le utilizzano. La toolchain predefinita le nuove caratteristiche del linguaggio eseguendo Trasformazioni bytecode, chiamate desugar, nell'ambito della compilazione D8/R8 di file di classe in codice DEX, come mostrato nella figura 1.

Supporto delle funzionalità di linguaggio Java 8 utilizzando il bytecode "desugar"
    trasformazioni
. Figura 1. Supporto delle funzionalità del linguaggio Java 8 utilizzando desugar trasformazioni bytecode.
di Gemini Advanced.
.

Supporto delle funzionalità del linguaggio Java 8 (plug-in Android Gradle 3.0.0+)

Per iniziare a utilizzare le funzionalità del linguaggio Java 8 supportate:

  1. Aggiornare il plug-in Android per Gradle alla versione 3.0.0 o successive.
  2. Per ogni modulo che usa Java 8 le caratteristiche del linguaggio naturale (nel codice sorgente o tramite dipendenze), aggiorna il file build.gradle o build.gradle.kts del modulo come mostrato di seguito:

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

Alla moda

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

Quando crei la tua app utilizzando il plug-in Android per Gradle 3.0.0 e versioni successive, il plug-in non supporta tutte le caratteristiche del linguaggio Java 8. La seguente lingua sono disponibili a qualsiasi livello API:

Funzionalità del linguaggio Java 8 Note
Espressioni Lambda Android non supporta la serializzazione espressioni lambda.
Riferimenti relativi ai metodi  
Digitare le annotazioni Le informazioni relative all'annotazione del tipo sono disponibili solo al momento della compilazione, non in fase di esecuzione. La piattaforma supporta TYPE nel livello API 24 e precedenti, ma non ElementType.TYPE_USE o ElementType.TYPE_PARAMETER.
Metodi di interfaccia predefiniti e statici  
Annotazioni ripetute  

Oltre a queste funzionalità del linguaggio Java 8, il plug-in Android per Gradle le versioni 3.0.0 e successive estendono il supporto per try-with-resources a tutti i livelli API Android.

Desugar non supporta MethodHandle.invoke oppure MethodHandle.invokeExact. Se il codice sorgente o una delle dipendenze del modulo utilizza uno di questi metodi, devi specificare minSdkVersion 26 o un valore superiore. In caso contrario, riceverai il seguente errore:

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

In alcuni casi, il modulo potrebbe non utilizzare invoke o invokeExact anche se sono inclusi in una dipendenza dalla libreria. Per continuare a utilizzare quella libreria con minSdkVersion 25 o un livello inferiore, attiva la riduzione del codice per rimuovere metodi inutilizzati. Se non funziona, prova a usare una libreria alternativa che non utilizza i metodi non supportati.

Funzionalità del linguaggio Java 8+ in fase di desugaring su Android Gradle plug-in 3.0.0 e versioni successive e non crea classi e API aggiuntive. (ad esempio java.util.stream.*) disponibile per l'utilizzo su release meno recenti di Android. Il supporto per la desugaring parziale dell'API Java è disponibile da Android Gradle plug-in 4.0.0 o successivo, come descritto nella sezione che segue.

Supporto della desugaring dell'API Java 8 e versioni successive (plug-in Android Gradle 4.0.0 o versioni successive)

Se crei la tua app utilizzando il plug-in Android per Gradle 4.0.0 o versioni successive, il plug-in estende il supporto per l'utilizzo di una serie di API del linguaggio Java 8 senza Richiedere un livello API minimo per l'app. Con il plug-in Android per Gradle 7.4.0 o sono disponibili anche API di linguaggio Java 11 libreria 2.0.0 o superiore.

Questo supporto aggiuntivo per le versioni precedenti della piattaforma è possibile perché La versione 4.0.0 e successive estende il motore di desugaring per dissuadere anche il linguaggio Java su quelle di livello inferiore. Puoi includere API del linguaggio standard che erano disponibili solo in release recenti di Android (ad esempio java.util.streams) nelle app che supportano versioni precedenti tutte le versioni di Android.

Il seguente insieme di API è supportato quando crei la tua app utilizzando Android Plug-in Gradle 4.0.0 o versioni successive:

  • Stream sequenziali (java.util.stream)
  • Un sottoinsieme di java.time
  • java.util.function
  • Aggiunte recenti a java.util.{Map,Collection,Comparator}
  • Facoltativo (java.util.Optional, java.util.OptionalInt e java.util.OptionalDouble) e alcuni nuovi corsi
  • Alcune aggiunte a java.util.concurrent.atomic (nuovi metodi su AtomicInteger, AtomicLong e AtomicReference)
  • ConcurrentHashMap (con correzioni di bug per Android 5.0)

Con il plug-in Android per Gradle 7.4.0 o versioni successive, vengono create API Java 11 aggiuntive supportati, ad esempio un sottoinsieme del pacchetto java.nio.file.

Per un elenco completo delle API supportate, visita API Java 8 e versioni successive disponibili tramite desugaring e API Java 11 e successive disponibili tramite desugaring.

Per supportare le API di questi linguaggi, il plug-in compila un file DEX separato che contiene un'implementazione delle API mancanti e la include nella tua app. Il processo di desugaring riscrive il codice della tua app per utilizzare invece questa libreria all'indirizzo runtime.

Per abilitare il supporto di queste API di linguaggio su qualsiasi versione di Android piattaforma:

  1. Aggiornare il plug-in Android per Gradle alla 4.0.0 (o successiva).
  2. Includi quanto segue nel modulo dell'app File build.gradle o 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")
}

Alla moda

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'
}

Tieni presente che potrebbe essere necessario includere anche lo snippet di codice precedente in una libreria build.gradle o build.gradle.kts del modulo se:

  • I test strumenti del modulo libreria utilizzano queste API dei linguaggi ( direttamente o tramite il modulo della libreria o le sue dipendenze). Questo avviene di modo le API mancanti sono fornite per l'APK di test instrumentato.

  • Vuoi eseguire lint sul modulo della libreria in modo isolato. Per aiutarti lint riconosce gli utilizzi validi delle API del linguaggio ed evita di segnalare i falsi positivi avvisi.

Nota inoltre che la desugaring delle API può essere combinata con il restringimento, ma quando si usa lo shrinker R8.

Versioni

La tabella seguente mostra le versioni della libreria API Java 8+ e la versione minima del plug-in Android per Gradle che supporta ogni versione:

Versione Versione minima del plug-in Android per Gradle
1.1.9 4.0.0
1.2.3 7.3.0
2.0.3 7.4.0-alpha10

Per dettagli sulle versioni della libreria API Java 8+, consulta File CHANGELOG.md nel repository GitHub di desugar_jdk_libs.