Nei progetti con molti moduli, può essere difficile distribuire le librerie Android agli utenti cercando di mantenere una struttura del progetto chiara. In molti casi, è necessario pubblicare molte più librerie di quelle previste.
Il plug-in Fused Library integrato con il plug-in Android per Gradle consente di pacchettizzare più moduli della libreria Android in un'unica libreria Android pubblicabile. In questo modo puoi modularizzare il codice sorgente e le risorse della libreria all'interno della build come preferisci, evitando di esporre la struttura del progetto una volta distribuito.
La distribuzione come singola libreria può offrire i seguenti vantaggi:
- Dipendenze semplificate: sostituisce più dipendenze della libreria con un singolo AAR, semplificando la configurazione del progetto e la gestione delle versioni per gli utenti
- Dimensioni della libreria ridotte: può migliorare la riduzione del codice, con conseguente riduzione delle dimensioni degli AAR
- Maggiore sicurezza: può offrire un maggiore controllo sui dettagli di implementazione interna delle librerie pubblicate
Crea una libreria fusa
Per creare una libreria fusa, devi creare un nuovo modulo Android, aggiungere le dipendenze e poi pubblicare la libreria fusa.
Prerequisiti
Per utilizzare il plug-in Fused Library, utilizza AGP 9.0 o versioni successive. Le versioni precedenti del plug-in della libreria fusa hanno un comportamento e problemi diversi che sono stati risolti in AGP 9.0.
Aggiungi un nuovo modulo di libreria fusa
Per utilizzare il plug-in, devi aggiungere un nuovo modulo Android al tuo progetto:
In questo esempio, il modulo della libreria fusa verrà chiamato myFusedLibrary.
- Aggiungi
include(":myFusedLibrary")al filesettings.gradle.kts. - Aggiungi
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }nella sezione[plugins]del filegradle/libs.versions.toml. - Aggiungi
alias(libs.plugins.android.fusedlibrary) apply falsenel blocco dei plug-in nel filebuild.gradle.ktsdi primo livello. - Per creare il modulo
myFusedLibrary, crea una nuova directory denominatamyFusedLibrary(fai clic con il tasto destro del mouse su "My Application" > New > Directory). - Crea un file
build.gradle.ktsnel modulomyFusedLibrary(fai clic con il tasto destro del mouse sul modulomyFusedLibrary> Nuovo > File). - Incolla quanto segue nel file
myFusedLibrary/build.gradle.kts:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Alla moda
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Aggiungi dipendenze
La funzionalità di base della libreria fusa è raggruppare le dipendenze. Il plug-in supporta l'aggiunta di dipendenze di progetti locali e librerie esterne.
Per specificare le dipendenze da pacchettizzare, utilizza la configurazione include.
Le dipendenze transitive non vengono pacchettizzate.
Ad esempio:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Alla moda
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Pubblica la libreria fusa
Prima di pubblicare una libreria fusa, devi acquisire familiarità con la pubblicazione di una libreria Android. La pubblicazione di una libreria fusa è simile alla pubblicazione di una libreria Android, ma esistono alcune differenze fondamentali che devi considerare per pubblicare correttamente la libreria fusa:
- Il plug-in Maven Publish deve essere applicato anche a tutti i moduli a cui è applicato il plug-in Fused Library.
- La pubblicazione deve ereditare da
fusedLibraryComponentperché questo fornisce le dipendenze necessarie per compilare l'artefatto della libreria fusa.
Ecco un esempio di configurazione delle pubblicazioni:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Alla moda
plugins { id 'com.android.fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
Pubblica la libreria unita per i test
Devi eseguire il test in base a una libreria fusa pubblicata da un'app per Android o da una libreria Android. Il metodo consigliato è pubblicare la libreria fusa e le relative dipendenze del progetto in un repository Maven locale.
Per pubblicare gli artefatti della libreria fusa in un repository locale, definisci una configurazione simile alla seguente:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Alla moda
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Carica la libreria fusa
Per distribuire la libreria fusa, consulta Carica la libreria.
Comportamento e misure di salvaguardia
La combinazione di librerie Android presenta complessità che possono rendere difficile per il plug-in ragionare sulle priorità. Ad esempio, due librerie con lo stesso classpath causeranno un errore di build durante la fusione della libreria. L'unione delle risorse terrà conto dell'ordine delle dipendenze specificate quando si seleziona una risorsa con lo stesso nome in librerie diverse.
- Le librerie fuse possono essere pubblicate solo come artefatto della libreria Android AAR per essere aggiunte come dipendenza.
- La fusione di librerie che utilizzano l'associazione di dati non è supportata.
- Non puoi unire più tipi di build e versioni prodotto in un'unica libreria fusa. Crea librerie fuse separate per le diverse varianti.
Per bilanciare la quantità di configurazione necessaria e la facilità d'uso, il plug-in non riuscirà a creare la build in caso di conflitti ambigui o utilizzerà l'euristica durante la fusione degli artefatti. I dettagli su come vengono fusi gli artefatti sono riportati nella tabella seguente:
| Tipo | Comportamento |
|---|---|
| Classi | Le librerie con lo stesso percorso di classe causeranno un errore di build durante la fusione della libreria. |
| Risorse Android | L'unione delle risorse terrà conto dell'ordine delle dipendenze specificate quando si seleziona una risorsa con lo stesso nome in un altro progetto. |
| Metadati AAR | Le versioni dei metadati AAR vengono unite dando la priorità al valore più alto di ogni libreria di dipendenze. È disponibile un DSL per eseguire l'override di questi valori. Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| Risorse Java | I file di risorse Java in più librerie con percorsi identici non sono consentiti e causeranno un errore di build. |
Problemi noti
Fused Library è un nuovo plug-in e sono presenti problemi noti su cui si sta lavorando per soddisfare tutti i casi d'uso. Puoi segnalare bug per eventuali problemi che riscontri.
- Problema n. 454305444: le librerie contenenti regole ProGuard consumer non denominate "proguard.txt" causano un errore di build. Risolto in AGP 9.1 e versioni successive.
- Problema n. 374982739: aggiunta di dipendenze dei file ad altri file .aar
- Problema n. 231433225: nessun supporto per la fusione degli artefatti RenderScript e Prefab
Comprendi le dipendenze di una libreria fusa
La libreria fusa non ha origini e utilizza effettivamente le librerie Android come unica origine, quindi è importante capire cosa proviene da dove. Per elencare le dipendenze unite nell'artefatto risultante e quelle necessarie per creare l'artefatto, esegui l'attività gradle :report sulla libreria fusa. L'attività genera un report JSON che viene salvato nella directory build/reports della libreria fusa.
Per ulteriori informazioni sulle dipendenze interne dei plug-in, esegui l'attività gradle :dependencies per visualizzare lo stato delle configurazioni dei plug-in.