Mit Publikationsvarianten kannst du Nutzern ein personalisiertes Erlebnis bieten. Wenn Sie Publikationsvarianten konfigurieren, können Sie verschiedene Build-Varianten mit jeweils eigenen Attributen veröffentlichen.
Wenn Sie mehrere Build-Varianten Ihrer Bibliothek veröffentlichen, können Nutzer die für ihre Anforderungen geeigneten Funktionen auswählen. So haben Sie beispielsweise die Möglichkeit, verschiedene Artefakte für die Build-Typen Debug- und Release-Typ zu veröffentlichen. Das Artefakt der Debug-Publikation kann zusätzlichen Logging-Code und andere Abhängigkeiten haben, um dieses zusätzliche Logging zu aktivieren.
Bevor Sie fortfahren, müssen Sie Ihre Bibliothek auf die Veröffentlichung vorbereiten.
Gradle-Modulmetadaten verwenden
Wenn Sie Varianten Ihrer Bibliothek veröffentlichen möchten, müssen Sie die Gradle Module Metadata (GMM) verwenden. GMM beschreibt Ihre Publikation und verwaltet die variantenbasierte Abhängigkeitsverwaltung. GMM wird standardmäßig mit Ihrer Bibliothek veröffentlicht.
Zu den Vorteilen von GMM gehören:
- Wenn Sie GMM mit Gradle 6.0 oder höher verwenden, können Sie mehrere Publikationsvarianten oder mehrere Artefakte mit jeweils eigenen Attributen und Abhängigkeiten veröffentlichen. Wenn Sie die POM-Datei von Maven anstelle von GMM verwenden, können Sie nur ein Artefakt veröffentlichen. Bei Verwendung einer POM-Datei können Sie zusätzliche Artefakte mithilfe von Klassifikatoren veröffentlichen, diese dürfen jedoch keine eigenen Abhängigkeiten haben.
- Gradle erstellt automatisch eine Variante für die Kompilierung und eine für die Laufzeit mit jeweils eigenen Abhängigkeiten. Sie können eine Variante für die Kompilierung und eine für die Laufzeit veröffentlichen, sodass Nutzer je nachdem, wann sie Ihre Bibliothek verwenden, auswählen können. Mit GMM können Nutzer je nach Nutzung von
api
,implementation
odercompileOnly
/runtimeOnly
durch die veröffentlichte Bibliothek unterschiedliche Abhängigkeiten für Kompilierung und Laufzeit sehen. Eine vollständige Liste der Abhängigkeiten finden Sie unter Abhängigkeitskonfigurationen. Das ist auch dann möglich, wenn du eine einzelne Publikationsvariante veröffentlichst. - Wenn Sie Test-Displays verwenden, können Sie eine zusätzliche Variante mit speziellen Metadaten oder Funktionen veröffentlichen, über die der Nutzer sie auswählen kann. Das ist auch dann möglich, wenn du nur eine Variante einer Publikation veröffentlichst.
Publikationsvarianten verstehen
Damit Sie die Funktionsweise von Publikationsvarianten verstehen können, sollten Sie sich mit den grundlegenden Veröffentlichungsschritten von Gradle vertraut machen. Hier einige wichtige Konzepte der Publikation:
- Build-Variante: Die Konfiguration, die Gradle verwendet, um Ihre Bibliothek zu erstellen. Diese ist das Produkt aus Build-Typ und Produkt-Flavor. Weitere Informationen finden Sie im Android-Build-Glossar.
- Artefakt: Eine Datei oder ein Verzeichnis, die bzw. das von einem Build erstellt wird. Bei der Veröffentlichung einer Bibliothek ist ein Artefakt normalerweise eine JAR- oder AAR-Datei.
- Publikationsvariante: Ein Artefakt mit den zugehörigen Attributen, Funktionen und Abhängigkeiten. Gradle ruft die Publikationsvarianten variants auf. Sie werden in diesen Dokumenten jedoch als Publikationsvarianten bezeichnet, um sie von Build-Varianten zu unterscheiden.
- Attribut: Gradle verwendet Attribute, um Publikationsvarianten zu identifizieren und auszuwählen, wenn es mehrere Optionen gibt.
org.gradle.usage=java-api
undorg.gradle.jvm.version=11
sind beispielsweise Variantenattribute. - Softwarekomponente: Ein Gradle-Objekt, das eine oder mehrere Publikationsvarianten enthalten kann und in einem einzelnen Satz von Maven-Koordinaten (
groupdId:artifactId:version
) veröffentlicht wird. Es wird überProject.getComponents()
in der DSL von Gradle verfügbar gemacht. - Publikation: Was im Repository veröffentlicht wird und von Nutzern verwendet wird. Publikationen bestehen aus einer Softwarekomponente und ihren Metadaten, z. B. ihrer Identität (
groupId:artifactId:version
).
Das Android Gradle-Plug-in (AGP) 7.1 führt eine domainspezifische Sprache (DSL) ein, um zu steuern, welche Build-Varianten bei der Veröffentlichung verwendet und welche ignoriert werden. Mit der DSL können Sie Instanzen von SoftwareComponent
erstellen, die eines der folgenden Elemente enthalten:
- Eine Publikationsvariante aus einer Build-Variante
- Mehrere Publikationsvarianten aus mehreren Build-Varianten
Beim Erstellen einer Softwarekomponente mit mehreren Publikationsvarianten legt AGP für jede Variante Attribute fest, damit der Nutzer die gewünschte Variante auswählen kann. Diese Attribute stammen direkt aus dem Build-Typ und den Geschmacksrichtungen, die zum Erstellen der Build-Variante verwendet wurden. Zum Erstellen einer Komponente mit einer einzelnen Publikationsvariante sind keine Attribute erforderlich, da diese nicht unterschieden werden müssen.
Softwarekomponente mit einer einzelnen Publikationsvariante erstellen
Mit dem folgenden Snippet wird eine Softwarekomponente mit einer einzelnen Publikationsvariante konfiguriert, die aus der Build-Variante release
erstellt wurde, und die Quell-JAR-Datei als sekundäres Artefakt hinzugefügt:
Kotlin
android { publishing { singleVariant("release") { withSourcesJar() } } }
Groovig
android { publishing { singleVariant('release') { withSourcesJar() } } }
Du kannst mehrere Komponenten mit jeweils einer einzelnen Publikationsvariante erstellen und sie unter verschiedenen Maven-Koordinaten verteilen. In diesem Fall werden keine Attribute für die Publikationsvariante festgelegt. In den Publikationsmetadaten lässt sich nicht erkennen, ob diese Publikationsvariante zur Build-Variante release
gehört. Da nur eine Publikationsvariante beteiligt ist, ist keine Unterscheidung erforderlich.
Softwarekomponente mit mehreren Publikationsvarianten erstellen
Sie können alle Build-Varianten oder einen Teil davon auswählen, um sie in eine einzelne Softwarekomponente einzufügen. AGP verwendet automatisch die Namen der Build-Typen, Produktvarianten und Produktvarianten, um Attribute zu erstellen, damit das nutzende Projekt zwischen ihnen unterscheiden kann.
Wenn Sie alle Build-Varianten in einer einzelnen Komponente veröffentlichen möchten, geben Sie allVariants()
im multipleVariants{}
-Block in der Datei build.gradle
auf Modulebene an:
Kotlin
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
Groovig
android { publishing { multipleVariants { allVariants() withJavadocJar() } } }
Dadurch wird eine einzelne Komponente mit dem Namen default
erstellt. Wenn Sie der Komponente einen anderen Namen geben möchten, verwenden Sie multipleVariants({name})
.
In diesem Fall werden alle Dimensionen vom Typ „Build-Typ“ und „Produktgeschmack“ als Attribute verwendet.
Mit includeBuildTypeValues()
und includeFlavorDimensionAndValues()
können Sie auch auswählen, welche Varianten veröffentlicht werden sollen:
Kotlin
android { publishing { multipleVariants("custom") { includeBuildTypeValues("debug", "release") includeFlavorDimensionAndValues( dimension = "color", values = arrayOf("blue", "pink") ) includeFlavorDimensionAndValues( dimension = "shape", values = arrayOf("square") ) } } }
Groovig
android { publishing { multipleVariants('custom') { includeBuildTypeValues('debug', 'release') includeFlavorDimensionAndValues( /*dimension =*/ 'color', /*values =*/ 'blue', 'pink' ) includeFlavorDimensionAndValues( /*dimension =*/ 'shape', /*values =*/ 'square' ) } } }
In diesem Beispiel enthält die benutzerdefinierte Komponente alle Kombinationen von (debug
, release
) für den Build-Typ, (blue
, pink
) für die Dimension color
und (square
) für die Dimension shape
.
Alle Flavor-Dimensionen müssen aufgelistet werden, auch wenn Sie nur einen Wert aus einer Dimension veröffentlichen, damit AGP weiß, welcher Wert für jede Dimension verwendet werden soll.
In der folgenden Tabelle sind die resultierenden Publikationsvarianten und die zugehörigen Attribute aufgeführt.
Variante | Merkmale |
---|---|
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"
|
In der Praxis werden mehr Varianten veröffentlicht. Beispielsweise wird jede der oben genannten Varianten zweimal veröffentlicht, einmal zur Kompilierung und einmal für die Laufzeit, mit unterschiedlichen Abhängigkeiten (je nachdem, ob die deklarierten Abhängigkeiten implementation
oder api
verwenden) und mit einem anderen Wert für das Attribut org.gradle.Usage
. Die Artefakte (AAR-Datei) für diese beiden Varianten sind jedoch identisch.
Weitere Informationen finden Sie in der Dokumentation zur publishing
API.
Kompatibilitätsproblem beim Veröffentlichen von Bibliotheken mit mehreren Geschmacksrichtungen
Ein Projekt, das AGP 7.0 oder niedriger verwendet, kann keine Multi-Flavor-Bibliotheken nutzen, die mit AGP 7.1 oder höher veröffentlicht wurden. Dies ist ein bekanntes Problem, das durch eine Änderung des Attributnamens für die Dimension „Produktgeschmack“ von dimensionName
zu com.android.build.api.attributes.ProductFlavor:dimensionName
in AGP 7.1 verursacht wird.
Je nach Einrichtung Ihres Projekts können Sie missingDimensionStrategy
in der alten API-Variante verwenden, um dieses Problem zu umgehen.
Angenommen, Ihr Anwendungsprojekt hat nur eine Dimension für die Produktvarianten:
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)
}
}
Groovig
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)
}
}