In Projekten mit vielen Modulen kann es schwierig sein, Android-Bibliotheken an Ihre Nutzer zu verteilen und gleichzeitig eine klare 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 hilft beim Verpacken mehrerer Android-Bibliotheksmodule in eine einzige veröffentlichbare Android-Bibliothek. So können Sie den Quellcode und die Ressourcen Ihrer Bibliothek im Build nach Bedarf modularisieren, ohne dass die Struktur Ihres Projekts nach der Verteilung offengelegt wird.
Die Bereitstellung als einzelne Bibliothek kann folgende Vorteile haben:
- Vereinfachte Abhängigkeiten: Mehrere Bibliotheksabhängigkeiten werden durch eine einzige AAR ersetzt, was die Projekteinrichtung und Versionsverwaltung für Ihre Nutzer vereinfacht.
- Reduzierte Bibliotheksgröße: Kann die Codekomprimierung verbessern, was zu kleineren AARs führt
- Verbesserte Sicherheit: Bietet eine bessere Kontrolle über die internen Implementierungsdetails veröffentlichter Bibliotheken.
Zusammengeführte Bibliothek erstellen
Wenn Sie eine zusammengeführte Bibliothek erstellen möchten, müssen Sie ein neues Android-Modul erstellen, Abhängigkeiten hinzufügen und dann die zusammengeführte Bibliothek veröffentlichen.
Vorbereitung
Wenn Sie das Fused Library-Plug-in verwenden möchten, benötigen Sie AGP 9.0 oder höher. Frühere Versionen des Fused Library-Plug-ins weisen ein anderes Verhalten und Probleme auf, die in AGP 9.0 behoben wurden.
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.
- Hängen Sie
include(":myFusedLibrary")an die Dateisettings.gradle.ktsan. - Fügen Sie
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }im Abschnitt[plugins]in der Dateigradle/libs.versions.tomlhinzu. - Fügen Sie
alias(libs.plugins.android.fusedlibrary) apply falseim Plug-in-Block in der Dateibuild.gradle.ktsauf oberster Ebene hinzu. - Erstellen Sie ein neues Verzeichnis mit dem Namen
myFusedLibrary(Rechtsklick auf „My Application“ > „New“ > „Directory“), um das ModulmyFusedLibraryzu erstellen. - Erstellen Sie eine
build.gradle.kts-Datei immyFusedLibrary-Modul (Rechtsklick auf dasmyFusedLibrary-Modul > „Neu“ > „Datei“). - Fügen Sie Folgendes in die Datei
myFusedLibrary/build.gradle.ktsein:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Abhängigkeiten hinzufügen
Die Hauptfunktion 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 Konfiguration include, um Abhängigkeiten anzugeben, die gepackt werden sollen.
Transitive Abhängigkeiten werden nicht gepackt.
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 zusammengeführte Bibliothek veröffentlichen, sollten Sie sich mit dem Veröffentlichen einer Android-Bibliothek vertraut machen. Das Veröffentlichen einer zusammengeführten Bibliothek ähnelt dem Veröffentlichen einer Android-Bibliothek. Es gibt jedoch einige wichtige Unterschiede, die Sie beachten müssen, um die zusammengeführte Bibliothek korrekt zu veröffentlichen:
- Das Maven Publish-Plug-in muss auch auf alle Module angewendet werden, auf die das Fused Library-Plug-in angewendet wird.
- Die Veröffentlichung muss von
fusedLibraryComponenterben, da dies die erforderlichen Abhängigkeiten zum Kompilieren des zusammengeführten Bibliotheksartefakts bereitstellt.
Hier 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 '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 } } }
Fused Library zum Testen veröffentlichen
Du solltest die Abhängigkeit von einer veröffentlichten zusammengeführten Bibliothek in einer Android-App oder Android-Bibliothek testen. Die empfohlene Methode besteht darin, die zusammengeführte Bibliothek und ihre Projektabhängigkeiten in einem lokalen Maven-Repository zu veröffentlichen.
Wenn Sie die zusammengeführten Bibliotheksartefakte in einem lokalen Repository veröffentlichen möchten, definieren Sie eine Konfiguration ähnlich der folgenden:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Fused-Bibliothek hochladen
Informationen zum Veröffentlichen Ihrer zusammengeführten Bibliothek finden Sie unter Bibliothek hochladen.
Verhalten und Schutzmaßnahmen
Das Kombinieren von Android-Bibliotheken ist komplex, sodass es für das Plug-in schwierig sein kann, Prioritäten zu bestimmen. Zwei Bibliotheken mit demselben Klassenpfad führen beispielsweise zu einem Build-Fehler, wenn die Bibliothek zusammengeführt wird. Bei der Zusammenführung von Ressourcen wird die Reihenfolge der angegebenen Abhängigkeiten berücksichtigt, wenn eine Ressource mit demselben Namen in verschiedenen Bibliotheken ausgewählt wird.
- 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 Datenbindung verwenden, wird nicht unterstützt.
- Es ist nicht möglich, mehrere Build-Typen und Produktvarianten in einer einzigen zusammengeführten Bibliothek zusammenzuführen. Erstellen Sie separate zusammengeführte Bibliotheken für verschiedene Varianten.
Um die erforderliche Konfiguration und die Nutzerfreundlichkeit in Einklang zu bringen, schlägt das Plug-in entweder bei mehrdeutigen Konflikten fehl oder verwendet Heuristiken beim Zusammenführen von Artefakten. In der folgenden Tabelle finden Sie Details dazu, wie Artefakte zusammengeführt werden:
| Typ | 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 angegebenen Abhängigkeiten berücksichtigt, wenn eine Ressource mit demselben Namen in verschiedenen Ressourcen ausgewählt wird. |
| 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. Kotlin androidFusedLibrary { 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
Die Fused Library ist ein neues Plug-in. Es gibt bekannte Probleme, an denen gearbeitet wird, um alle Anwendungsfälle abzudecken. Sie können Fehler melden, wenn Probleme auftreten.
- Problem 454305444: Bibliotheken, die ProGuard-Regeln für Nutzer enthalten, die nicht „proguard.txt“ heißen, führen zu einem Build-Fehler. In AGP 9.1 und höher behoben.
- Problem 374982739: Dateielemente von anderen .aar-Dateien hinzufügen
- Problem 231433225: Keine Unterstützung für das Zusammenführen von RenderScript- und Prefab-Artefakten
Abhängigkeiten einer zusammengeführten Bibliothek verstehen
Die zusammengeführte Bibliothek hat keine Quellen und verwendet Android-Bibliotheken als einzige Quelle. Es ist wichtig zu wissen, was woher kommt. Wenn Sie die Abhängigkeiten auflisten möchten, die im resultierenden 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. Die Aufgabe generiert einen JSON-Bericht, 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 der Plug-in-Konfigurationen aufzurufen.