Dans les projets comportant de nombreux modules, il peut être difficile de distribuer des bibliothèques Android à vos utilisateurs tout en essayant de maintenir une structure de projet claire. Dans de nombreux cas, un nombre beaucoup plus élevé de bibliothèques doit être publié que prévu.
Le plug-in Fused Library fourni avec le plug-in Android Gradle permet d'empaqueter plusieurs modules de bibliothèque Android dans une seule bibliothèque Android publiable. Cela vous permet de modulariser le code source et les ressources de votre bibliothèque dans votre build comme vous le souhaitez, tout en évitant d'exposer la structure de votre projet une fois distribué.
La distribution sous forme de bibliothèque unique peut présenter les avantages suivants:
- Dépendances simplifiées:remplace plusieurs dépendances de bibliothèque par une seule AAR, ce qui simplifie la configuration du projet et la gestion des versions pour vos utilisateurs.
- Taille de bibliothèque réduite:peut améliorer la minification de code, ce qui réduit la taille des AAR.
- Sécurité améliorée:permet de mieux contrôler les détails d'implémentation interne des bibliothèques publiées.
Créer une bibliothèque fusionnée
Pour créer une bibliothèque fusionnée, vous devez créer un module Android, ajouter des dépendances, puis publier la bibliothèque fusionnée.
Ajouter un nouveau module de bibliothèque fusionnée
Pour utiliser le plug-in, vous devez ajouter un nouveau module Android à votre projet:
Dans cet exemple, le module de bibliothèque fusionnée s'appelle myFusedLibrary
.
- Activez la prise en charge des bibliothèques fusionnées en ajoutant
android.experimental.fusedLibrarySupport=true
au fichiergradle.properties
. - Ajoutez
include(":myFusedLibrary")
au fichiersettings.gradle.kts
. - Ajoutez
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
sous la section[plugins]
du fichiergradle/libs.versions.toml
. - Ajoutez
alias(libs.plugins.android.fusedlibrary) apply false
dans le bloc "plugins" du fichierbuild.gradle.kts
de premier niveau. - Pour créer le module
myFusedLibrary
, créez un répertoire nommémyFusedLibrary
(clic droit sur "My Application" > New > Directory). - Créez un fichier
build.gradle.kts
dans le modulemyFusedLibrary
(effectuez un clic droit sur le modulemyFusedLibrary
> Nouveau > Fichier). - Collez ce qui suit dans le fichier
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 { }
Ajouter des dépendances
La fonctionnalité principale de la bibliothèque fusionnée est de regrouper les dépendances. Le plug-in permet d'ajouter des dépendances de projet locales et des bibliothèques externes.
Pour spécifier les dépendances à empaqueter, utilisez la configuration include
.
Les dépendances transitives ne sont pas empaquetées.
Exemple :
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Publier votre bibliothèque fusionnée
Vous devez vous familiariser avec la publication d'une bibliothèque Android avant de publier une bibliothèque fusionnée. La publication d'une bibliothèque fusionnée est semblable à celle d'une bibliothèque Android. Toutefois, vous devez tenir compte de quelques différences importantes pour publier correctement la bibliothèque fusionnée:
- Le plug-in Maven Publish doit également être appliqué à tout module auquel le plug-in Fused Library est appliqué.
- La publication doit hériter de
fusedLibraryComponent
, car elle fournit les dépendances requises pour compiler l'artefact de bibliothèque fusionnée.
Voici un exemple de configuration de publications:
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 } } }
Publier votre bibliothèque fusionnée à des fins de test
Vous devez effectuer des tests en fonction d'une bibliothèque fusionnée publiée à partir d'une application ou d'une bibliothèque Android. La méthode recommandée consiste à publier la bibliothèque fusionnée et ses dépendances de projet dans un dépôt Maven local.
Pour publier les artefacts de bibliothèque fusionnée dans un dépôt local, définissez une configuration semblable à la suivante:
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') } }
Importer votre bibliothèque fusionnée
Pour distribuer votre bibliothèque fusionnée, consultez Importer votre bibliothèque.
Comportement et mesures de protection
La combinaison de bibliothèques Android présente des complexités qui peuvent rendre difficile pour le plug-in de raisonner sur les priorités. Par exemple, deux bibliothèques avec le même chemin d'accès à la classe entraîneront un échec de compilation lors de la fusion de la bibliothèque. La fusion de ressources tient compte de l'ordre des dépendances spécifié lors de la sélection d'une ressource portant le même nom dans différentes bibliothèques.
- Les bibliothèques fusionnées ne peuvent être publiées qu'en tant qu'artefact de bibliothèque Android AAR afin d'être ajoutées en tant que dépendance.
- Il n'est pas possible de fusionner des bibliothèques qui utilisent la liaison de données.
- Vous ne pouvez pas fusionner plusieurs types de compilation et de types de produit dans une même bibliothèque fusionnée. Créez des bibliothèques fusionnées distinctes pour différentes variantes.
Pour équilibrer la quantité de configuration nécessaire et la facilité d'utilisation, le plug-in échouera à la compilation en cas de conflits ambigus ou utilisera des heuristiques lors de la fusion des artefacts. Vous trouverez des informations détaillées sur la fusion des artefacts dans le tableau suivant:
Saisie | Comportement |
---|---|
Classes | Les bibliothèques ayant le même chemin d'accès à la classe entraînent un échec de compilation lors de la fusion de la bibliothèque. |
Ressources pour Android | La fusion de ressources tient compte de l'ordre des dépendances spécifié lors de la sélection d'une ressource portant le même nom dans différents fichiers. |
Métadonnées AAR | Les versions des métadonnées AAR sont fusionnées en donnant la priorité à la valeur la plus élevée de chaque bibliothèque de dépendances. Un DSL est fourni pour remplacer ces valeurs. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Ressources Java | Les fichiers de ressources Java dans plusieurs bibliothèques avec des chemins identiques ne sont pas autorisés et entraînent un échec de compilation. |
Problèmes connus
La bibliothèque fusionnée est un nouveau plug-in. Des problèmes connus sont en cours de résolution pour répondre à tous les cas d'utilisation.
- Les fichiers
lint.jar
ne sont pas inclus dans l'AAR fusionné - Ajouter des dépendances de fichiers sur d'autres fichiers .aar
- Il n'est pas possible de fusionner les artefacts RenderScript et Prefab.
Comprendre les dépendances d'une bibliothèque fusionnée
La bibliothèque fusionnée n'a pas de sources et utilise effectivement les bibliothèques Android comme seule source. Il est donc important de comprendre d'où vient chaque élément. Pour lister les dépendances fusionnées dans l'artefact généré et les dépendances nécessaires à la création de l'artefact, exécutez la tâche gradle :report
sur la bibliothèque fusionnée. Les tâches génèrent un rapport JSON qui est enregistré dans le répertoire build/reports
de la bibliothèque fusionnée.
Pour en savoir plus sur les dépendances de plug-in internes, exécutez la tâche gradle :dependencies
pour afficher l'état des configurations de plug-in.