Nei progetti con molti moduli, può essere difficile distribuire le librerie Android agli utenti cercando di mantenere una struttura chiara del progetto. In molti casi, è necessario pubblicare molte più librerie del previsto.
Il plug-in Fused Library incluso in Android Gradle Plugin consente di raggruppare più moduli della libreria Android in un'unica libreria Android pubblicabile. In questo modo puoi modularizzare il codice sorgente e le risorse della tua libreria all'interno della build come preferisci, evitando l'esposizione della struttura del progetto una volta distribuito.
La distribuzione come singola libreria può avere 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 ridotte della libreria:può migliorare la riduzione del codice, portando a file AAR più piccoli
- Maggiore sicurezza:può offrire un maggiore controllo sui dettagli di implementazione interni delle librerie pubblicate
Creare una libreria unita
Per creare una libreria unita, devi creare un nuovo modulo Android, aggiungere le dipendenze e poi pubblicare la libreria unita.
Aggiungere un nuovo modulo della libreria unita
Per utilizzare il plug-in, devi aggiungere un nuovo modulo Android al tuo progetto:
In questo esempio, il modulo della libreria combinata verrà chiamato myFusedLibrary
.
- Attiva il supporto della libreria unita aggiungendo
android.experimental.fusedLibrarySupport=true
al filegradle.properties
. - 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 false
nel blocco dei plug-in nel filebuild.gradle.kts
di primo livello. - Per creare il modulo
myFusedLibrary
, crea una nuova directory chiamatamyFusedLibrary
(fai clic con il tasto destro del mouse su "La mia applicazione" > Nuovo > Directory). - Crea un file
build.gradle.kts
nel modulomyFusedLibrary
(fai clic con il tasto destro del mouse sul modulomyFusedLibrary
> Nuovo > File). - Incolla il codice seguente nel file
myFusedLibrary/build.gradle.kts
:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Aggiungere dipendenze
La funzionalità principale della libreria unita è raggruppare le dipendenze. Il
plug-in supporta l'aggiunta di dipendenze di progetti locali e librerie esterne.
Per specificare le dipendenze da includere nel pacchetto, utilizza la configurazione include
.
Le dipendenze transitive non vengono incluse nel pacchetto.
Ad esempio:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Pubblicare la libreria unita
Prima di pubblicare una libreria unita, devi acquisire familiarità con la pubblicazione di una libreria Android. La pubblicazione di una libreria unita è simile alla pubblicazione di una libreria Android, ma ci sono alcune differenze fondamentali che devi considerare per pubblicare correttamente la libreria unita:
- Il plug-in Maven Publish deve essere applicato anche a qualsiasi modulo a cui è applicato il plug-in Fused Library.
- La pubblicazione deve ereditare da
fusedLibraryComponent
perché fornisce le dipendenze necessarie per compilare l'artefatto della libreria unita.
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"]) } } }
Groovy
plugins { id '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 il test
Devi eseguire il test in base a una libreria combinata pubblicata da un'app Android o da una libreria Android. Il metodo consigliato è pubblicare nella libreria unita e le dipendenze del progetto in un repository Maven locale.
Per pubblicare gli artefatti della libreria unita 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")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Caricare la libreria unita
Per distribuire la tua raccolta unita, consulta Caricare la raccolta.
Comportamento e misure di salvaguardia
La combinazione di librerie Android presenta complessità che possono rendere difficile al plug-in ragionare sulle priorità. Ad esempio, due librerie con lo stesso classpath causeranno un errore di build durante l'unione della libreria. L'unione delle risorse prenderà in considerazione l'ordine delle dipendenze specificato quando si seleziona una risorsa con lo stesso nome in librerie diverse.
- Le librerie unite possono essere pubblicate solo come artefatto AAR della libreria Android per essere aggiunte come dipendenza.
- La fusione di librerie che utilizzano il data binding non è supportata.
- Non puoi unire più tipi di build e varianti di prodotto all'interno di una singola libreria unita. 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 in caso di conflitti ambigui o utilizzerà l'euristica durante l'unione degli artefatti. I dettagli su come vengono uniti gli artefatti sono riportati nella tabella seguente:
Tipo | Comportamento |
---|---|
Classi | Le librerie con lo stesso classpath causeranno un errore di build durante l'unione della libreria. |
Risorse Android | L'unione delle risorse prenderà in considerazione l'ordine delle dipendenze specificato quando si seleziona una risorsa con lo stesso nome in un'altra. |
Metadati AAR | Le versioni dei metadati AAR vengono unite dando la priorità al valore più alto di ogni libreria di dipendenze. Esiste un DSL fornito per sovrascrivere questi valori. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Risorse Java | I file di risorse Java in più librerie con percorsi identici non sono consentiti e genereranno un errore di compilazione. |
Problemi noti
La libreria unificata è un nuovo plug-in e sono noti problemi in fase di risoluzione per soddisfare tutti i casi d'uso.
- Impossibile generare i file JAR di origine
- Aggiunta di dipendenze di file su altri file .aar
- Nessun supporto per la fusione di artefatti RenderScript e Prefab
Comprendere le dipendenze di una libreria unita
La libreria unita non ha origini e utilizza effettivamente le librerie Android
come unica origine, è importante capire da dove provengono i dati. Per elencare
le dipendenze unite nell'artefatto risultante e le
dipendenze necessarie per creare l'artefatto, esegui l'attività gradle :report
nella
libreria unita. L'attività genera un report JSON che viene salvato nella
directory build/reports
della libreria unita.
Per ulteriori informazioni relative alle dipendenze interne dei plug-in, esegui l'attività
gradle :dependencies
per visualizzare lo stato delle configurazioni dei plug-in.