Indipendentemente dal fatto che il codice sorgente sia scritto in Java, Kotlin o entrambi, ci sono diversi punti in cui devi scegliere una versione JDK o del linguaggio Java per la tua build.
Glossario
- Java Development Kit (JDK)
-
Il Java Development Kit (JDK)
contiene:
- Strumenti, come un compilatore, un profiler e un creatore di archivi. Questi vengono utilizzati dietro le quinte durante la build per creare l'applicazione.
- Librerie contenenti API che puoi chiamare dal tuo codice sorgente Kotlin o Java. Tieni presente che non tutte le funzioni sono disponibili su Android.
- La macchina virtuale Java (JVM), un interprete che esegue applicazioni Java. Utilizzi la JVM per eseguire l'IDE Android Studio e lo strumento di compilazione Gradle. La JVM non viene utilizzata su dispositivi o emulatori Android.
- JetBrains Runtime (JBR)
- JetBrains Runtime (JBR) è un JDK migliorato, distribuito con Android Studio. Include diverse ottimizzazioni per l'utilizzo in Studio e nei prodotti JetBrains correlati, ma può essere utilizzato anche per eseguire altre applicazioni Java.
Come faccio a scegliere un JDK per eseguire Android Studio?
Ti consigliamo di utilizzare JBR per eseguire Android Studio. Viene distribuito
con Android Studio e utilizzato per testarlo e include miglioramenti per un utilizzo ottimale
di Android Studio. Per assicurarti che ciò non accada, non impostare la variabile di ambiente STUDIO_JDK.
Gli script di avvio per Android Studio cercano una JVM nel seguente ordine:
- Variabile di ambiente
STUDIO_JDK - Directory
studio.jdk(nella distribuzione di Android Studio) jbr(JetBrains Runtime) nella distribuzione di Android Studio. Consigliata.- Variabile di ambiente
JDK_HOME - Variabile di ambiente
JAVA_HOME javaeseguibile nella variabile di ambientePATH
Come faccio a scegliere quale JDK esegue le build Gradle?
Se esegui Gradle utilizzando i pulsanti di Android Studio, viene utilizzato il JDK impostato nelle
impostazioni di Android Studio. Se esegui Gradle in un terminale,
all'interno o all'esterno di Android Studio, la variabile di ambiente JAVA_HOME
(se impostata) determina quale JDK esegue gli script Gradle. Se JAVA_HOME
non è impostato, utilizza il comando java sulla variabile di ambiente PATH.
Per risultati più coerenti, assicurati di impostare la variabile di ambiente JAVA_HOME e la configurazione JDK di Gradle in Android Studio sullo stesso JDK.
Quando esegui la build, Gradle crea un processo chiamato daemon per eseguire la build effettiva. Questo processo può essere riutilizzato, a condizione che le build utilizzino la stessa versione di JDK e Gradle. Il riutilizzo di un daemon riduce il tempo necessario per avviare una nuova JVM e inizializzare il sistema di build.
Se avvii build con JDK o versioni di Gradle diverse, vengono creati daemon aggiuntivi, che consumano più CPU e memoria.
Configurazione di Gradle JDK in Android Studio
Per modificare la configurazione Gradle JDK del progetto esistente, apri le impostazioni di Gradle da File (o Android Studio su macOS) > Impostazioni > Build, esecuzione, deployment > Strumenti di build > Gradle. Il menu a discesa Gradle JDK contiene le seguenti opzioni tra cui scegliere:
- Macro come
JAVA_HOMEeGRADLE_LOCAL_JAVA_HOME - Voci della tabella JDK nel formato
vendor-versioncomejbr-17, archiviate nei file di configurazione Android - Download di un JDK
- Aggiunta di un JDK specifico
- JDK rilevati localmente dalla directory di installazione JDK predefinita del sistema operativo
L'opzione selezionata viene memorizzata nell'opzione gradleJvm del file .idea/gradle.xml del progetto e la relativa risoluzione del percorso JDK viene utilizzata per eseguire Gradle quando viene avviato tramite Android Studio.
Le macro consentono la selezione dinamica del percorso JDK del progetto:
JAVA_HOME: utilizza la variabile di ambiente con lo stesso nomeGRADLE_LOCAL_JAVA_HOME: utilizza la proprietàjava.homenel file.gradle/config.properties, che per impostazione predefinita è JetBrains Runtime.
L'JDK selezionato viene utilizzato per eseguire la build Gradle e risolvere i riferimenti all'API JDK durante la modifica degli script di build e del codice sorgente. Tieni presente che il
compileSdk specificato limiterà ulteriormente i simboli Java disponibili
durante la modifica e la creazione del codice sorgente.
Assicurati di scegliere una versione di JDK superiore o uguale alle versioni di JDK utilizzate dai plug-in che utilizzi nella build Gradle. Per determinare la versione minima richiesta di JDK per il plug-in Android per Gradle (AGP), consulta la tabella di compatibilità nelle note di rilascio.
Ad esempio, il plug-in Android per Gradle versione 8.x richiede JDK 17. Se provi a eseguire una build Gradle che lo utilizza con una versione precedente di JDK, viene visualizzato un messaggio simile a:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /usr/local/buildtools/java/jdk
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changing `org.gradle.java.home` in `gradle.properties`.
Quali API Java posso utilizzare nel mio codice sorgente Java o Kotlin?
Un'applicazione Android può utilizzare alcune delle API definite in un JDK, ma non tutte. L'SDK Android definisce le implementazioni di molte funzioni della libreria Java
come parte delle sue API disponibili. La proprietà compileSdk specifica la versione dell'SDK Android da utilizzare durante la compilazione del codice sorgente Kotlin o Java.
Kotlin
android {
...
compileSdk = 33
}
Groovy
android {
...
compileSdk 33
}
Ogni versione di Android supporta una versione specifica di JDK e un sottoinsieme delle
API Java disponibili. Se utilizzi un'API Java disponibile in
un compileSdk che non è disponibile nel
minSdk specificato, potresti essere in grado di utilizzare l'API
nella versione precedente di Android tramite una procedura nota come
desugaring.
Consulta API Java 11+ disponibili tramite desugarizzazione per le API supportate.
Utilizza questa tabella per determinare quale versione di Java è supportata da ciascuna API Android e dove trovare i dettagli sulle API Java disponibili.
| Android | Java | Funzionalità API e linguistiche supportate |
|---|---|---|
| 14 (API 34) | 17 | Librerie principali |
| 13 (API 33) | 11 | Librerie principali |
| 12 (API 32) | 11 | API Java |
| 11 e precedenti | Versioni di Android |
Quale JDK compila il mio codice sorgente Java?
L'JDK Java toolchain contiene il compilatore Java utilizzato per compilare qualsiasi codice sorgente Java. Questa JDK esegue anche javadoc e test delle unità durante la build.
La toolchain utilizza per impostazione predefinita il JDK utilizzato per eseguire Gradle. Se utilizzi l'impostazione predefinita ed esegui una build su macchine diverse (ad esempio, la macchina locale e un server di integrazione continua separato), i risultati della build possono variare se vengono utilizzate versioni JDK diverse.
Per creare una build più coerente, puoi specificare esplicitamente una versione della toolchain Java. Se specifichi questo:
- Individua un JDK compatibile sul sistema che esegue la build.
- Se non esiste una JDK compatibile (e viene definito un resolver della toolchain), ne scarica una.
- Espone le API Java della toolchain per le chiamate dal codice sorgente.
- Compila l'origine Java utilizzando la versione del linguaggio Java.
- Fornisce i valori predefiniti per
sourceCompatibilityetargetCompatibility.
Ti consigliamo di specificare sempre la toolchain Java e di assicurarti che la JDK specificata sia installata o di aggiungere un resolver della toolchain alla build.
Puoi specificare la toolchain indipendentemente dal fatto che il codice sorgente sia scritto in Java,
Kotlin o entrambi. Specifica la toolchain al livello superiore del file
build.gradle(.kts) del modulo.
Specifica la versione della toolchain Java nel seguente modo:
Kotlin
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Groovy
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Funziona se l'origine è Kotlin, Java o un mix di entrambi.
La versione JDK della toolchain può essere la stessa del JDK utilizzato per eseguire Gradle, ma tieni presente che hanno scopi diversi.
Quali funzionalità di origine del linguaggio Java posso utilizzare nel mio codice sorgente Java?
La proprietà sourceCompatibility determina quali funzionalità del linguaggio Java
sono disponibili durante la compilazione dell'origine Java.
Non influisce sull'origine Kotlin.
Specifica sourceCompatibility nel file build.gradle(.kts) del modulo come segue:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
Se non specificata, questa proprietà viene impostata per impostazione predefinita sulla versione della toolchain Java. Se non utilizzi una toolchain Java, viene impostata una versione scelta dal plug-in Android Gradle (ad esempio Java 8 o versioni successive).
Quali funzionalità binarie Java possono essere utilizzate quando compilo l'origine Kotlin o Java?
Le proprietà targetCompatibility e jvmTarget determinano la versione del formato della classe Java utilizzata per generare bytecode per il codice sorgente Java e Kotlin compilato, rispettivamente.
Alcune funzionalità di Kotlin esistevano prima che venissero aggiunte le funzionalità Java equivalenti.
I primi compilatori Kotlin dovevano creare un proprio modo per rappresentare queste funzionalità di Kotlin. Alcune di queste funzionalità sono state aggiunte in seguito a Java.
Con i livelli jvmTarget successivi, il compilatore Kotlin potrebbe utilizzare direttamente
la funzionalità Java, il che potrebbe comportare un rendimento migliore.
Versioni diverse di Android supportano versioni diverse di Java. Puoi
sfruttare funzionalità Java aggiuntive aumentando
targetCompatibility e jvmTarget, ma questo potrebbe costringerti anche
ad aumentare la
versione minima dell'SDK Android per assicurarti
che la funzionalità sia disponibile.
Tieni presente che targetCompatibility deve essere maggiore o uguale a
sourceCompatibility. In pratica, sourceCompatibility,
targetCompatibility e jvmTarget devono generalmente utilizzare lo stesso valore.
Puoi impostarli nel seguente modo:
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}
Se non specificate, queste proprietà vengono impostate per impostazione predefinita sulla versione della toolchain Java. Se non utilizzi una toolchain Java, i valori predefiniti potrebbero essere diversi e causare problemi di build. Pertanto, ti consigliamo di specificare sempre in modo esplicito questi valori o di utilizzare una toolchain Java.