In Projekten mit vielen Modulen kann es schwierig sein, Android-Bibliotheken an Ihre Nutzer zu verteilen und gleichzeitig eine übersichtliche Projektstruktur beizubehalten. In vielen Fällen müssen viel mehr Bibliotheken veröffentlicht werden als beabsichtigt.
Das im Android-Gradle-Plug-in enthaltene Fused Library-Plug-in unterstützt Sie beim Verpacken mehrerer Android-Bibliotheksmodule in einer einzigen veröffentlichten Android-Bibliothek. So können Sie den Quellcode und die Ressourcen Ihrer Bibliothek nach Bedarf modularisieren, ohne die Struktur Ihres Projekts nach der Verteilung preiszugeben.
Die Verteilung als einzelne Bibliothek kann folgende Vorteile haben:
- Vereinfachte Abhängigkeiten:Mehrere Bibliotheksabhängigkeiten werden durch ein einzelnes AAR ersetzt, wodurch die Projekteinrichtung und die Versionsverwaltung für Ihre Nutzer vereinfacht werden.
- Reduzierte Bibliotheksgröße:Dies kann die Codekomprimierung verbessern und zu kleineren AARs führen.
- Höhere Sicherheit:Bietet eine bessere Kontrolle über die internen Implementierungsdetails veröffentlichter Bibliotheken.
Kombinierte Bibliothek erstellen
Wenn Sie eine zusammengeführte Bibliothek erstellen möchten, müssen Sie ein neues Android-Modul erstellen, Abhängigkeiten hinzufügen und die zusammengeführte Bibliothek dann veröffentlichen.
Neues Modul für zusammengeführte Bibliotheken hinzufügen
Wenn Sie das Plug-in verwenden möchten, müssen Sie Ihrem Projekt ein neues Android-Modul hinzufügen:
In diesem Beispiel heißt das zusammengeführte Bibliotheksmodul myFusedLibrary
.
- Aktivieren Sie die Unterstützung für kombinierte Bibliotheken, indem Sie
android.experimental.fusedLibrarySupport=true
in die Dateigradle.properties
einfügen. - Hängen Sie
include(":myFusedLibrary")
an die Dateisettings.gradle.kts
an. - Fügen Sie
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
unter dem Abschnitt[plugins]
in der Dateigradle/libs.versions.toml
hinzu. - Fügen Sie
alias(libs.plugins.android.fusedlibrary) apply false
im Block „plugins“ in derbuild.gradle.kts
-Datei auf oberster Ebene hinzu. - Erstellen Sie zum Erstellen des Moduls
myFusedLibrary
ein neues Verzeichnis mit dem NamenmyFusedLibrary
(klicken Sie mit der rechten Maustaste auf „My Application“ > „New“ > „Directory“). - Erstellen Sie eine
build.gradle.kts
-Datei immyFusedLibrary
-Modul (klicken Sie mit der rechten Maustaste auf dasmyFusedLibrary
-Modul > „Neu“ > „Datei“). - Fügen Sie Folgendes in die Datei
myFusedLibrary/build.gradle.kts
ein:
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 { }
Abhängigkeiten hinzufügen
Die Kernfunktion der zusammengeführten Bibliothek besteht darin, Abhängigkeiten zu bündeln. Das Plug-in unterstützt das Hinzufügen lokaler Projektabhängigkeiten und externer Bibliotheken.
Verwenden Sie die include
-Konfiguration, um die zu verpackenden Abhängigkeiten anzugeben.
Transitive Abhängigkeiten werden nicht verpackt.
Beispiel:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Zusammengeführte Bibliothek veröffentlichen
Bevor Sie eine kombinierte Bibliothek veröffentlichen, sollten Sie sich mit dem Veröffentlichen einer Android-Bibliothek vertraut machen. Das Veröffentlichen einer kombinierten Bibliothek ähnelt dem Veröffentlichen einer Android-Bibliothek. Es gibt jedoch einige wichtige Unterschiede, die Sie berücksichtigen müssen, damit die kombinierte Bibliothek richtig veröffentlicht wird:
- Das Maven Publish-Plug-in muss auch auf jedes Modul angewendet werden, auf das das Fused-Bibliotheks-Plug-in angewendet wird.
- Die Publikation muss von
fusedLibraryComponent
abgeleitet werden, da dies die erforderlichen Abhängigkeiten für die Kompilierung des Artefakts der zusammengeführten Bibliothek bereitstellt.
Hier sehen Sie ein Beispiel für eine Publikationskonfiguration:
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 } } }
Zusammengeführte Bibliothek zum Testen veröffentlichen
Sie sollten Tests auf Grundlage einer veröffentlichten kombinierten Bibliothek aus einer Android-App oder Android-Bibliothek durchführen. Es wird empfohlen, die kombinierte Bibliothek und ihre Projektabhängigkeiten in einem lokalen Maven-Repository zu veröffentlichen.
Wenn Sie die Artefakte der zusammengeführten Bibliothek in einem lokalen Repository veröffentlichen möchten, definieren Sie eine Konfiguration, die der folgenden ähnelt:
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') } }
Zusammengeführte Mediathek hochladen
Informationen zum Verteilen der zusammengeführten Mediathek finden Sie hier.
Verhalten und Sicherheitsmaßnahmen
Das Kombinieren von Android-Bibliotheken ist komplex und kann es für das Plug-in schwierig machen, Prioritäten zu berücksichtigen. Wenn beispielsweise zwei Bibliotheken denselben Klassenpfad haben, führt das beim Zusammenführen der Bibliothek zu einem Build-Fehler. Beim Zusammenführen von Ressourcen wird die Reihenfolge der Abhängigkeiten berücksichtigt, die beim Auswählen einer Ressource mit demselben Namen in verschiedenen Bibliotheken angegeben wurde.
- Zusammengeführte Bibliotheken können nur als Android-Bibliotheksartefakt (AAR) veröffentlicht werden, um als Abhängigkeit hinzugefügt zu werden.
- Das Zusammenführen von Bibliotheken, die die Datenbindung verwenden, wird nicht unterstützt.
- Es ist nicht möglich, mehrere Build-Typen und Produktvarianten in einer einzelnen zusammengeführten Bibliothek zusammenzuführen. Erstellen Sie separate Bibliotheken für verschiedene Varianten.
Um die erforderliche Konfiguration und die Nutzerfreundlichkeit in Einklang zu bringen, schlägt das Plug-in den Build bei mehrdeutigen Konflikten fehl oder verwendet Heuristiken beim Zusammenführen von Artefakten. Details dazu, wie Artefakte zusammengeführt werden, finden Sie in der folgenden Tabelle:
Eingeben | Verhalten |
---|---|
Klassen | Bibliotheken mit demselben Klassenpfad führen beim Zusammenführen der Bibliothek zu einem Build-Fehler. |
Android-Ressourcen | Beim Zusammenführen von Ressourcen wird die Reihenfolge der Abhängigkeiten berücksichtigt, die beim Auswählen einer Ressource mit demselben Namen in verschiedenen angegeben wurde. |
AAR-Metadaten | AAR-Metadatenversionen werden zusammengeführt, indem der höchste Wert aus jeder Abhängigkeitsbibliothek priorisiert wird. Es gibt eine DSL, mit der diese Werte überschrieben werden können. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Java-Ressourcen | Java-Ressourcendateien in mehreren Bibliotheken mit identischen Pfaden sind nicht zulässig und führen zu einem Build-Fehler. |
Bekannte Probleme
Fused Library ist ein neues Plug-in und es gibt bekannte Probleme, an denen gearbeitet wird, um alle Anwendungsfälle zu erfüllen.
- Quell-JAR-Dateien können nicht generiert werden
- Dateienabhängigkeiten von anderen .aar-Dateien hinzufügen
- Keine Unterstützung für das Zusammenführen von RenderScript- und Prefab-Artefakten
Abhängigkeiten einer zusammengeführten Bibliothek
Die zusammengeführte Bibliothek hat keine Quellen und verwendet effektiv Android-Bibliotheken als einzige Quelle. Daher ist es wichtig zu wissen, woher die einzelnen Elemente stammen. Wenn Sie die Abhängigkeiten auflisten möchten, die in das resultierende Artefakt zusammengeführt werden, und die Abhängigkeiten, die zum Erstellen des Artefakts erforderlich sind, führen Sie die Aufgabe gradle :report
für die zusammengeführte Bibliothek aus. Bei den Aufgaben wird ein JSON-Bericht generiert, der im Verzeichnis build/reports
der zusammengeführten Bibliothek gespeichert wird.
Weitere Informationen zu internen Plug-in-Abhängigkeiten erhalten Sie, wenn Sie die Aufgabe gradle :dependencies
ausführen, um den Status von Plug-in-Konfigurationen aufzurufen.