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 ü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.

  1. Aktivieren Sie die Unterstützung für kombinierte Bibliotheken, indem Sie android.experimental.fusedLibrarySupport=true in die Datei gradle.properties einfügen.
  2. Hängen Sie include(":myFusedLibrary") an die Datei settings.gradle.kts an.
  3. Fügen Sie android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } unter dem Abschnitt [plugins] in der Datei gradle/libs.versions.toml hinzu.
  4. Fügen Sie alias(libs.plugins.android.fusedlibrary) apply false im Block „plugins“ in der build.gradle.kts-Datei auf oberster Ebene hinzu.
  5. Erstellen Sie zum Erstellen des Moduls myFusedLibrary ein neues Verzeichnis mit dem Namen myFusedLibrary (klicken Sie mit der rechten Maustaste auf „My Application“ > „New“ > „Directory“).
  6. Erstellen Sie eine build.gradle.kts-Datei im myFusedLibrary-Modul (klicken Sie mit der rechten Maustaste auf das myFusedLibrary-Modul > „Neu“ > „Datei“).
  7. 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.

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

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.