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](https://developer.android.com/static/studio/images/write/desugar_diagram.png?authuser=0000&hl=it)
desugar
trasformazioni bytecode.
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:
- Aggiornare il plug-in Android per Gradle alla versione 3.0.0 o successive.
- Per ogni modulo che usa Java 8
le caratteristiche del linguaggio naturale (nel codice sorgente o tramite dipendenze),
aggiorna il file
build.gradle
obuild.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
ejava.util.OptionalDouble
) e alcuni nuovi corsi - Alcune aggiunte a
java.util.concurrent.atomic
(nuovi metodi suAtomicInteger
,AtomicLong
eAtomicReference
) 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:
- Aggiornare il plug-in Android per Gradle alla 4.0.0 (o successiva).
- Includi quanto segue nel modulo dell'app
File
build.gradle
obuild.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
.