Aggiungere dipendenze di compilazione

Il sistema di compilazione Gradle in Android Studio ti consente di includere binari esterni o altri moduli della libreria nella tua build come dipendenze. Le dipendenze possono trovarsi sul tuo computer o in un repository remoto e qualsiasi dipendenza transitiva dichiarata viene inclusa automaticamente. Questa pagina descrive come utilizzare le dipendenze con il tuo progetto Android, inclusi i dettagli su comportamenti e configurazioni specifici del plug-in Android per Gradle (AGP). Per una guida concettuale più approfondita alle dipendenze Gradle, consulta la guida di Gradle per la gestione delle dipendenze, ma ricorda che il tuo progetto Android deve utilizzare solo le configurazioni delle dipendenze definite in questa pagina.

Aggiungere una dipendenza di libreria o plugin

Il modo migliore per aggiungere e gestire le dipendenze di build è utilizzare i cataloghi delle versioni, il metodo utilizzato per impostazione predefinita dai nuovi progetti. Questa sezione illustra i tipi di configurazioni più comuni utilizzati per i progetti Android. Per ulteriori opzioni, consulta la documentazione di Gradle. Per un esempio di app che utilizza i cataloghi delle versioni, consulta Now in Android. Se hai già configurato le dipendenze di build senza cataloghi delle versioni e hai un progetto multimodulo, ti consigliamo di eseguire la migrazione.

Per indicazioni su come aggiungere e gestire le dipendenze native (non comuni), vedi Dipendenze native.

Nell'esempio seguente, aggiungiamo una dipendenza binaria remota (la libreria Jetpack Macrobenchmark), una dipendenza del modulo della libreria locale (myLibrary) e una dipendenza del plug-in (il plug-in Android per Gradle) al nostro progetto. Di seguito sono riportati i passaggi generali per aggiungere queste dipendenze al tuo progetto:

  1. Aggiungi un alias per la versione della dipendenza che vuoi nella sezione [versions] del file del catalogo delle versioni, chiamato libs.versions.toml (nella directory gradle nella visualizzazione Progetto o Script Gradle nella visualizzazione Android):

    [versions]
    agp = "8.3.0"
    androidx-macro-benchmark = "1.2.2"
    my-library = "1.4"
    
    [libraries]
    ...
    
    [plugins]
    ...
    

    Gli alias possono includere trattini o trattini bassi. Questi alias generano valori nidificati a cui puoi fare riferimento negli script di build. I riferimenti iniziano con il nome del catalogo, la parte libs di libs.versions.toml. Quando utilizzi un catalogo a versione singola, ti consigliamo di mantenere il valore predefinito "libs.".

  2. Aggiungi un alias per la dipendenza nelle sezioni [libraries] (per i binari remoti o i moduli della libreria locale) o [plugins] (per i plug-in) del file libs.versions.toml.

    [versions]
    ...
    
    [libraries]
    androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" }
    my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" }
    
    [plugins]
    androidApplication = { id = "com.android.application", version.ref = "agp" }
    

    Alcune librerie sono disponibili in una distinta materiali (BOM) pubblicata che raggruppa le famiglie di librerie e le relative versioni. Puoi includere una distinta materiali nei file di catalogo delle versioni e di build e lasciare che gestisca queste versioni per te. Per i dettagli, consulta Utilizzo della distinta materiali.

  3. Aggiungi un riferimento all'alias della dipendenza allo script di build dei moduli che richiedono la dipendenza. Converti i trattini bassi e i trattini dell'alias in punti quando lo fai riferimento da uno script di build. Lo script di build a livello di modulo avrebbe il seguente aspetto:

    Kotlin

    plugins {
      alias(libs.plugins.androidApplication)
    }
    
    dependencies {
      implementation(libs.androidx.benchmark.macro)
      implementation(libs.my.library)
    }

    Groovy

    plugins {
      alias 'libs.plugins.androidApplication'
    }
    
    dependencies {
      implementation libs.androidx.benchmark.macro
      implementation libs.my.library
    }

    I riferimenti ai plug-in includono plugins dopo il nome del catalogo e i riferimenti alle versioni includono versions dopo il nome del catalogo (i riferimenti alle versioni sono rari; vedi Dipendenze con gli stessi numeri di versione per esempi di riferimenti alle versioni). I riferimenti alla libreria non includono un qualificatore libraries, quindi non puoi utilizzare versions o plugins all'inizio di un alias della libreria.

Configura le dipendenze

All'interno del blocco dependencies, puoi dichiarare una dipendenza della libreria utilizzando una delle diverse configurazioni delle dipendenze (ad esempio implementation mostrata in precedenza). Ogni configurazione delle dipendenze fornisce a Gradle istruzioni diverse su come utilizzare la dipendenza. La tabella seguente descrive ciascuna delle configurazioni che puoi utilizzare per una dipendenza nel tuo progetto Android.

Configurazione Comportamento
implementation Gradle aggiunge la dipendenza al classpath di compilazione e la inserisce nell'output della build. Quando il modulo configura una dipendenza implementation, comunica a Gradle che non vuoi che il modulo divulghi la dipendenza ad altri moduli in fase di compilazione. ovvero la dipendenza non viene resa disponibile ad altri moduli che dipendono dal modulo corrente.

L'utilizzo di questa configurazione delle dipendenze anziché di api può comportare miglioramenti significativi del tempo di compilazione perché riduce il numero di moduli che il sistema di compilazione deve ricompilare. Ad esempio, se una dipendenza implementation modifica la propria API, Gradle ricompila solo quella dipendenza e i moduli che dipendono direttamente da essa. La maggior parte dei moduli di app e test deve utilizzare questa configurazione.

api Gradle aggiunge la dipendenza al classpath di compilazione e all'output della build. Quando un modulo include una dipendenza api, comunica a Gradle che il modulo vuole esportare in modo transitivo la dipendenza in altri moduli, in modo che sia disponibile sia in fase di runtime che di compilazione.

Utilizza questa configurazione con cautela e solo con le dipendenze che devi esportare in modo transitivo ad altri consumatori upstream. Se una dipendenza api modifica la sua API esterna, Gradle ricompila tutti i moduli che hanno accesso a quella dipendenza in fase di compilazione. Un numero elevato di dipendenze api può aumentare notevolmente il tempo di compilazione. A meno che tu non voglia esporre l'API di una dipendenza a un modulo separato, i moduli della libreria devono invece utilizzare le dipendenze implementation.

compileOnly Gradle aggiunge la dipendenza solo al classpath di compilazione (ovvero non viene aggiunta all'output di build). Questa opzione è utile quando crei un modulo Android e hai bisogno della dipendenza durante la compilazione, ma la sua presenza è facoltativa in fase di runtime. Ad esempio, se dipendi da una libreria che include solo annotazioni in fase di compilazione, in genere utilizzate per generare codice ma spesso non incluse nell'output della build, potresti contrassegnare la libreria come compileOnly.

Se utilizzi questa configurazione, il modulo della libreria deve includere una condizione di runtime per verificare se la dipendenza è disponibile e quindi modificare il suo comportamento in modo che possa comunque funzionare se non viene fornita. Ciò consente di ridurre le dimensioni dell'app finale non aggiungendo dipendenze temporanee non critiche.

Nota:non puoi utilizzare la configurazione compileOnly con le dipendenze Android Archive (AAR).

runtimeOnly Gradle aggiunge la dipendenza solo all'output di build, per l'utilizzo durante l'esecuzione. ovvero non viene aggiunto al classpath di compilazione. Viene utilizzato raramente su Android, ma comunemente nelle applicazioni server per fornire implementazioni di logging. Ad esempio, una libreria potrebbe utilizzare un'API di logging che non include un'implementazione. I consumatori di questa libreria potrebbero aggiungerla come dipendenza implementation e includere una dipendenza runtimeOnly per l'implementazione effettiva della registrazione da utilizzare.
ksp
kapt
annotationProcessor

Queste configurazioni forniscono librerie che elaborano le annotazioni e altri simboli nel codice prima della compilazione. In genere, con questi strumenti puoi convalidare il codice o generare codice aggiuntivo, riducendo la quantità di codice che devi scrivere.

Per aggiungere una dipendenza di questo tipo, devi aggiungerla al classpath del processore di annotazioni utilizzando le configurazioni ksp, kapt o annotationProcessor. L'utilizzo di queste configurazioni migliora le prestazioni di compilazione separando il classpath di compilazione dal classpath del processore di annotazioni. Se Gradle trova processori di annotazioni nel classpath di compilazione, disattiva l'evitamento della compilazione, il che influisce negativamente sul tempo di compilazione (Gradle 5.0 e versioni successive ignorano i processori di annotazioni trovati nel classpath di compilazione).

Il plug-in Android per Gradle presuppone che una dipendenza sia un processore di annotazioni se il relativo file JAR contiene il seguente file:

META-INF/services/javax.annotation.processing.Processor

Se il plug-in rileva un processore di annotazioni presente nel classpath di compilazione, genera un errore di compilazione.

ksp è un processore di simboli Kotlin ed è eseguito dal compilatore Kotlin.

kapt e apt sono strumenti separati che elaborano le annotazioni prima dell'esecuzione dei compilatori Kotlin o Java.

Quando decidi quale configurazione utilizzare, considera quanto segue:

  • Se un processore è disponibile come processore di simboli Kotlin, utilizzalo come dipendenza ksp. Per informazioni dettagliate sull'utilizzo dei processori di simboli Kotlin, consulta la pagina Eseguire la migrazione da kapt a ksp.
  • Se il processore non è disponibile come processore di simboli Kotlin:
    • Se il tuo progetto include l'origine Kotlin (ma può includere anche l'origine Java), utilizza kapt per includerla.
    • Se il tuo progetto utilizza solo l'origine Java, utilizza annotationProcessor per includerla.

Per ulteriori informazioni sull'utilizzo dei processori di annotazioni, vedi Aggiungere processori di annotazioni.

lintChecks

Utilizza questa configurazione per includere una libreria contenente i controlli lint che vuoi che Gradle esegua durante la creazione del progetto di app per Android.

Tieni presente che gli AAR che contengono un file lint.jar eseguiranno automaticamente i controlli definiti in quel file lint.jar; non è necessario aggiungere una dipendenza lintChecks esplicita. In questo modo puoi definire librerie e controlli lint associati in una singola dipendenza, assicurandoti che i controlli vengano eseguiti quando i consumatori utilizzano la tua libreria.

lintPublish Utilizza questa configurazione nei progetti di librerie Android per includere i controlli lint che vuoi che Gradle compili in un file lint.jar e inserisca nel tuo AAR. In questo modo, i progetti che utilizzano il tuo AAR applicano anche questi controlli lint. Se in precedenza utilizzavi la configurazione delle dipendenze lintChecks per includere i controlli lint nell'AAR pubblicato, devi eseguire la migrazione di queste dipendenze per utilizzare invece la configurazione lintPublish.

Kotlin

dependencies {
  // Executes lint checks from the ":checks" project at build time.
  lintChecks(project(":checks"))
  // Compiles lint checks from the ":checks-to-publish" into a
  // lint.jar file and publishes it to your Android library.
  lintPublish(project(":checks-to-publish"))
}

Groovy

dependencies {
  // Executes lint checks from the ':checks' project at build time.
  lintChecks project(':checks')
  // Compiles lint checks from the ':checks-to-publish' into a
  // lint.jar file and publishes it to your Android library.
  lintPublish project(':checks-to-publish')
}

Configurare le dipendenze per una variante di build specifica

Tutte le configurazioni precedenti applicano le dipendenze a tutte le varianti di build. Se invece vuoi dichiarare una dipendenza solo per un insieme di origini di una variante di build specifico o per un insieme di origini di test, devi scrivere il nome della configurazione in maiuscolo e anteporre il nome della variante di build o dell'insieme di origini di test.

Ad esempio, per aggiungere una dipendenza binaria remota solo alla variante "senza costi" del prodotto utilizzando la configurazione implementation, utilizza questo codice:

Kotlin

dependencies {
    freeImplementation("com.google.firebase:firebase-ads:21.5.1")
}

Groovy

dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:21.5.1'
}

Tuttavia, se vuoi aggiungere una dipendenza per una variante che combina un flavor del prodotto e un tipo di build, devi inizializzare il nome della configurazione:

Kotlin

// Initializes a placeholder for the freeDebugImplementation dependency configuration.
val freeDebugImplementation by configurations.creating

dependencies {
    freeDebugImplementation(project(":free-support"))
}

Groovy

configurations {
    // Initializes a placeholder for the freeDebugImplementation dependency configuration.
    freeDebugImplementation {}
}

dependencies {
    freeDebugImplementation project(":free-support")
}

Per aggiungere le dipendenze implementation per i test locali e strumentati , il codice è il seguente:

Kotlin

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation("junit:junit:4.12")

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}

Groovy

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

Tuttavia, alcune configurazioni non hanno senso in questa situazione. Ad esempio, poiché altri moduli non possono dipendere da androidTest, viene visualizzato il seguente avviso se utilizzi la configurazione androidTestApi:

WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with
'androidTestImplementation'.

Ordine di dipendenza

L'ordine in cui elenchi le dipendenze indica la priorità di ciascuna: la prima libreria ha una priorità maggiore rispetto alla seconda, la seconda ha una priorità maggiore rispetto alla terza e così via. Questo ordine è importante nel caso in cui le risorse vengano unite o gli elementi del manifest vengano uniti alla tua app dalle librerie.

Ad esempio, se il tuo progetto dichiara quanto segue:

  • Dipendenza da LIB_A e LIB_B (in quest'ordine)
  • e LIB_A dipende da LIB_C e LIB_D (in quest'ordine)
  • Inoltre, LIB_B dipende anche da LIB_C

L'ordine delle dipendenze piatte sarà il seguente:

  1. LIB_A
  2. LIB_D
  3. LIB_B
  4. LIB_C

In questo modo, sia LIB_A che LIB_B possono ignorare LIB_C; e LIB_D ha comunque una priorità superiore a LIB_B perché LIB_A (che dipende da LIB_D) ha una priorità superiore a LIB_B.

Per ulteriori informazioni su come vengono uniti i manifest di diverse origini/dipendenze del progetto, vedi Unire più file manifest.

Informazioni sulle dipendenze per Play Console

Quando crei la tua app, AGP include metadati che descrivono le dipendenze di libreria compilate nell'app. Quando carichi l'app, Play Console esamina questi metadati per fornire avvisi relativi a problemi noti con gli SDK e le dipendenze utilizzati dall'app e, in alcuni casi, fornire feedback utili per risolvere questi problemi.

I dati vengono compressi, criptati da una chiave di firma di Google Play e archiviati nel blocco di firma dell'app di rilascio. Consigliamo di conservare questo file delle dipendenze per un'esperienza utente sicura e positiva. Puoi disattivare questa funzionalità includendo il seguente blocco dependenciesInfo nel file build.gradle.kts del modulo.

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

Per ulteriori informazioni sulle nostre norme e sui potenziali problemi relativi alle dipendenze, consulta la nostra pagina di assistenza su utilizzo di SDK di terze parti nella tua app.

Approfondimenti sull'SDK

Android Studio mostra avvisi lint nel file del catalogo delle versioni e nella finestra di dialogo Struttura progetto per gli SDK pubblici in Google Play SDK Index quando si verificano i seguenti problemi:

  • Gli SDK sono contrassegnati come obsoleti dai relativi autori.
  • Gli SDK violano le norme di Play.
  • Gli SDK presentano vulnerabilità di sicurezza note.
  • Gli SDK sono stati ritirati dai loro autori.

Gli avvisi indicano che devi aggiornare queste dipendenze, perché l'utilizzo di versioni obsolete potrebbe impedirti di pubblicare su Google Play Console in futuro.

Aggiungi dipendenze di build senza cataloghi delle versioni

Ti consigliamo di utilizzare i cataloghi delle versioni per aggiungere e gestire le dipendenze, ma i progetti semplici potrebbero non averne bisogno. Ecco un esempio di file di build che non utilizza cataloghi delle versioni:

Kotlin

plugins {
    id("com.android.application")
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation("com.example.android:app-magic:12.3")
    // Dependency on a local library module
    implementation(project(":mylibrary"))
}

Groovy

plugins {
    id 'com.android.application'
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
    // Dependency on a local library module
    implementation project(':mylibrary')
}

Questo file di build dichiara una dipendenza dalla versione 12.3 della libreria "app-magic" all'interno del gruppo di spazi dei nomi "com.example.android". La dichiarazione di dipendenza binaria remota è l'abbreviazione di quanto segue:

Kotlin

implementation(group = "com.example.android", name = "app-magic", version = "12.3")

Groovy

implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

Il file di build dichiara anche una dipendenza da un modulo della libreria Android denominato "mylibrary"; questo nome deve corrispondere al nome della libreria definito con un include: nel file settings.gradle.kts. Quando crei l'app, il sistema di build compila il modulo della libreria e inserisce i contenuti compilati risultanti nell'app.

Il file di build dichiara anche una dipendenza dal plug-in Android Gradle (com.application.android). Se hai più moduli che utilizzano lo stesso plug-in, puoi avere una sola versione del plug-in nel classpath di build in tutti i moduli. Anziché specificare la versione in ciascuno degli script di build del modulo, devi includere la dipendenza del plug-in nello script di build principale con la versione e indicare di non applicarla. L'aggiunta di apply false indica a Gradle di annotare la versione del plug-in, ma di non utilizzarla nella build principale. In genere, lo script di build principale è vuoto, ad eccezione di questo blocco plugins.

Kotlin

plugins {
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

Groovy

plugins {
    id com.android.application version 8.3.0-rc02 apply false
}

Se hai un progetto a modulo singolo, puoi specificare la versione in modo esplicito nello script di build a livello di modulo e lasciare vuoto lo script di build a livello di progetto:

Kotlin

plugins {
    id("com.android.application") version "8.3.0"
}

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02'
}