Mehrere Android-Bibliotheken als eine mit der Fusionsbibliothek veröffentlichen

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.

  1. Hängen Sie include(":myFusedLibrary") an die Datei settings.gradle.kts an.
  2. Fügen Sie android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } im Abschnitt [plugins] in der Datei gradle/libs.versions.toml hinzu.
  3. Fügen Sie alias(libs.plugins.android.fusedlibrary) apply false im Plug-in-Block in der Datei build.gradle.kts auf oberster Ebene hinzu.
  4. Erstellen Sie ein neues Verzeichnis mit dem Namen myFusedLibrary (Rechtsklick auf „My Application“ > „New“ > „Directory“), um das Modul myFusedLibrary zu erstellen.
  5. Erstellen Sie eine build.gradle.kts-Datei im myFusedLibrary-Modul (Rechtsklick auf das myFusedLibrary-Modul > „Neu“ > „Datei“).
  6. 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 '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 fusedLibraryComponent erben, 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.