Les variantes de publication vous permettent de proposer une expérience plus personnalisée à vos utilisateurs. Configurer des variantes de publication permet de publier différentes variantes de compilation, chacune avec ses propres attributs.
Ces différentes variantes de compilation de votre bibliothèque permettent à vos utilisateurs de choisir les fonctionnalités qui répondent à leurs besoins. Par exemple, vous pouvez publier des artefacts différents pour les types de compilation débogage ou release. Votre artefact de publication de débogage pourrait comporter un code de journalisation supplémentaire et différentes dépendances nécessaires à son exécution.
Avant de continuer, assurez-vous de préparer votre bibliothèque n vue de sa publication.
Utiliser les métadonnées du module Gradle
Pour publier des variantes de votre bibliothèque, vous devez utiliser les métadonnées du module Gradle (GMM). Les GMM décrivent votre publication et assurent la gestion des dépendances basée sur les variantes. Par défaut, les GMM sont publiées dans votre bibliothèque.
Voici quelques avantages des GMM :
- Si vous utilisez les GMM avec Gradle 6.0 ou une version ultérieure, vous pouvez publier plusieurs variantes de publication ou plusieurs artefacts, chacun avec ses propres attributs et dépendances. Si vous utilisez le fichier POM de Maven au lieu de GMM, vous ne pouvez publier qu'un seul artefact. Si vous utilisez un fichier POM, vous pouvez publier d'autres artefacts à l'aide de classificateurs, mais ces artefacts ne peuvent pas avoir leurs propres dépendances.
- Gradle crée automatiquement une variante pour la compilation et une pour l'environnement d'exécution, chacune avec ses propres dépendances. Vous pouvez publier une variante pour la compilation et une autre pour l'environnement d'exécution, afin que le consommateur puisse choisir en fonction du moment où il utilise votre bibliothèque. GMM permet aux consommateurs de voir
différentes dépendances pour la compilation et
en fonction de l'utilisation par la bibliothèque publiée
api
,implementation
oucompileOnly
/runtimeOnly
. Voir Configurations de dépendances pour obtenir la liste complète des dépendances. Cette option est disponible même si vous ne publiez qu'une seule variante de publication. - Lorsque vous utilisez des outils de test, vous pouvez publier une autre variante avec des des métadonnées fonctionnalités permettant au consommateur de la sélectionner. Cette option est disponible même si vous ne publiez qu'une seule variante de publication.
Comprendre les variantes de publication
Pour comprendre le fonctionnement des variantes de publication, il est utile de se familiariser de Gradle la procédure de publication de base. Voici quelques concepts clés de publication :
- Variante de compilation : la configuration que Gradle utilise pour compiler votre bibliothèque. Il s'agit du produit croisé de votre type de compilation et de votre type de produit. Pour en savoir plus, consultez le glossaire de la compilation Android.
- Artefact : un fichier ou un répertoire produit par une compilation. Dans un contexte de publication de bibliothèque, un artefact est généralement un fichier JAR ou AAR.
- Variante de publication : un artefact avec les attributs, fonctionnalités et dépendances associées. Remarque que Gradle appelle les variantes de publication variants. Toutefois, on les appelle variantes de publication dans ces documents afin de les distinguer variantes de compilation.
- Attribut : un élément qui permet à Gradle d'identifier et de sélectionner des variantes de publication lorsqu'il existe plusieurs options. Par exemple,
org.gradle.usage=java-api
etorg.gradle.jvm.version=11
sont des attributs de variante. - Composant logiciel : un objet Gradle pouvant contenir une ou plusieurs variantes de publication. Publié dans un même ensemble de coordonnées Maven (
groupdId:artifactId:version
) et exposé dans le DSL de Gradle viaProject.getComponents()
. - Publication : éléments publiés dans le dépôt et utilisés par les consommateurs. Les publications consistent en un composant logiciel et des métadonnées, telles que son identité (
groupId:artifactId:version
).
Le plug-in Android Gradle (AGP) 7.1 introduit un langage spécifique au domaine (DSL) pour déterminer quelles variantes de compilation sont utilisées ou ignorées lors de la publication. Le DSL vous permet de créer des instances de SoftwareComponent
contenant l'un des éléments suivants :
- Une variante de publication provenant d'une variante de compilation
- Plusieurs variantes de publication provenant de plusieurs variantes de compilation
Lors de la création d'un composant logiciel avec plusieurs variantes de publication, AGP définit des attributs pour chaque variante afin de permettre au consommateur de sélectionner la variante dont il a besoin. Ces attributs proviennent directement du type de compilation et des types de produit utilisés pour créer la variante de compilation. La création d'un composant avec une seule variante de publication ne nécessite pas d'attributs, car il n'y a pas d'ambiguïté.
Créer un composant logiciel avec une seule variante de publication
L'extrait de code suivant configure un composant logiciel avec une seule variante de publication, créée à partir de la variante de compilation release
, et ajoute le fichier JAR source en tant qu'artefact secondaire :
Kotlin
android { publishing { singleVariant("release") { withSourcesJar() } } }
Groovy
android { publishing { singleVariant('release') { withSourcesJar() } } }
Vous pouvez créer plusieurs composants, chacun avec une seule variante de publication, et les distribuer sous différentes coordonnées Maven. Dans ce cas, les attributs ne sont pas définis pour la variante de publication. Examiner les métadonnées de la publication ne permet pas de savoir si cette variante de publication provient de la variante de compilation release
. Étant donné qu'il n'y a qu'une seule variante de publication, il n'y a aucune ambiguïté.
Créer un composant logiciel avec plusieurs variantes de publication
Vous pouvez sélectionner toutes vos variantes de compilation, ou seulement un sous-ensemble, et les intégrer dans un composant logiciel unique. AGP utilise automatiquement les noms des types de compilation, types de produit et groupes de types de produit pour créer des attributs permettant au projet de les distinguer.
Pour publier toutes les variantes de compilation dans un seul composant, spécifiez allVariants()
dans le bloc multipleVariants{}
du fichier build.gradle
au niveau du module :
Kotlin
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
Groovy
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
Cette opération crée un unique composant nommé default
. Pour attribuer un autre nom à votre composant, utilisez multipleVariants({name})
.
Dans ce cas, tous les types de compilation et groupes de types de produit sont utilisés en tant qu'attributs.
Vous pouvez également sélectionner les variantes publiées à l'aide de includeBuildTypeValues()
et includeFlavorDimensionAndValues()
:
Kotlin
android { publishing { multipleVariants("custom") { includeBuildTypeValues("debug", "release") includeFlavorDimensionAndValues( dimension = "color", values = arrayOf("blue", "pink") ) includeFlavorDimensionAndValues( dimension = "shape", values = arrayOf("square") ) } } }
Groovy
android { publishing { multipleVariants('custom') { includeBuildTypeValues('debug', 'release') includeFlavorDimensionAndValues( /*dimension =*/ 'color', /*values =*/ 'blue', 'pink' ) includeFlavorDimensionAndValues( /*dimension =*/ 'shape', /*values =*/ 'square' ) } } }
Dans cet exemple, le composant personnalisé contient toutes les combinaisons (debug
, release
) pour le type de compilation, (blue
, pink
) pour le groupe de types color
, et (square
) pour le groupe de types shape
.
Tous les groupes de types de produit doivent être répertoriés, même si vous ne publiez qu'une seule valeur d'un groupe donné, pour qu'AGP sache quelle valeur utiliser pour chaque groupe.
Le tableau suivant répertorie les variantes de publication obtenues et leurs attributs associés.
Variante | Attributs |
---|---|
blueSquareDebug | com.android.build.api.attributes.BuildTypeAttr ="debug"
com.android.build.api.attributes.ProductFlavorAttr:color ="blue" |
blueSquareRelease |
com.android.build.api.attributes.BuildTypeAttr="release"
|
pinkSquareDebug |
com.android.build.api.attributes.BuildTypeAttr="debug"
|
pinkSquareRelease |
com.android.build.api.attributes.BuildTypeAttr="release"
|
En pratique, davantage de variantes sont publiées. Par exemple, chacune des variantes ci-dessus est publiée deux fois, une pour la compilation et une pour l'exécution, avec des dépendances différentes (selon que les dépendances déclarées utilisent implementation
ou api
), et avec une valeur différente pour l'attribut org.gradle.Usage
. Toutefois, les artefacts (fichier AAR) de ces deux variantes sont identiques.
Pour plus d'informations, consultez la section Documentation sur l'API publishing
.
Problème de compatibilité pour la publication de bibliothèques de plusieurs types
Un projet utilisant AGP 7.0 ou une version antérieure ne peut pas utiliser les bibliothèques de plusieurs types publiées
avec AGP 7.1 ou une version ultérieure. Il s'agit d'un problème connu causé par une modification de l'attribut
nom du groupe de types de produit de dimensionName
à
com.android.build.api.attributes.ProductFlavor:dimensionName
dans AGP 7.1.
Selon la configuration de votre projet, vous pouvez utiliser missingDimensionStrategy
dans
l'ancienne API des variantes pour qu'elle fonctionne
autour de ce problème.
Par exemple, supposons que votre projet d'application ne comporte qu'une version de produit groupe de types:
Kotlin
android {
applicationVariants.forEach { variant ->
val flavor = variant.productFlavors[0].name
val attributePrefix = "com.android.build.api.attributes.ProductFlavor"
val dimensionName = "version"
variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
}
}
Groovy
android {
applicationVariants.forEach { variant ->
def flavor = variant.getProductFlavors()[0].name
def attributePrefix = "com.android.build.api.attributes.ProductFlavor"
def dimensionName = "version"
variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
}
}