Pubblicare più librerie Android come una sola con la libreria combinata

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.

  1. Aggiungi include(":myFusedLibrary") al file settings.gradle.kts.
  2. Aggiungi android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } nella sezione [plugins] del file gradle/libs.versions.toml.
  3. Aggiungi alias(libs.plugins.android.fusedlibrary) apply false nel blocco dei plug-in nel file build.gradle.kts di primo livello.
  4. Per creare il modulo myFusedLibrary, crea una nuova directory denominata myFusedLibrary (fai clic con il tasto destro del mouse su "My Application" > New > Directory).
  5. Crea un file build.gradle.kts nel modulo myFusedLibrary (fai clic con il tasto destro del mouse sul modulo myFusedLibrary > Nuovo > File).
  6. 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 fusedLibraryComponent perché 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.