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

Bei Projekten mit vielen Modulen kann es schwierig sein, Android-Bibliotheken für Ihre Nutzer bereitzustellen und gleichzeitig eine klare Projektstruktur beizubehalten. In vielen Fällen müssen viel mehr Bibliotheken veröffentlicht werden als beabsichtigt.

Das Fused Library-Plug-in, das im Lieferumfang des Android Gradle-Plug-ins enthalten ist, unterstützt das Paketieren mehrerer Android-Bibliotheksmodule in einer einzigen veröffentlichbaren Android-Bibliothek. So können Sie den Quellcode und die Ressourcen Ihrer Bibliothek in Ihrem Build nach Belieben modularisieren und gleichzeitig verhindern, dass die Struktur Ihres Projekts nach der Bereitstellung offengelegt wird.

Die Bereitstellung als einzelne Bibliothek hat folgende Vorteile:

  • Vereinfachte Abhängigkeiten:Mehrere Bibliotheksabhängigkeiten werden durch eine einzelne AAR ersetzt, wodurch die Projekteinrichtung und Versionsverwaltung für Nutzer optimiert wird.
  • Verringerte Bibliotheksgröße:Kann die Codekomprimierung verbessern und zu kleineren AARs führen
  • Erhöhte Sicherheit: Sie können die internen Implementierungsdetails veröffentlichter Bibliotheken besser steuern.

Zusammengeführte Bibliothek erstellen

Wenn Sie eine verschmolzene Bibliothek erstellen möchten, müssen Sie ein neues Android-Modul erstellen, Abhängigkeiten hinzufügen und die verschmolzene Bibliothek dann veröffentlichen.

Neues Fusionsbibliotheksmodul 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 Fusionsbibliotheken, indem Sie der Datei gradle.properties android.experimental.fusedLibrarySupport=true hinzufügen.
  2. Hängen Sie include(":myFusedLibrary") an die Datei settings.gradle.kts an.
  3. Fügen Sie in der Datei gradle/libs.versions.toml unter dem Abschnitt [plugins] den Abschnitt android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } hinzu.
  4. Fügen Sie alias(libs.plugins.android.fusedlibrary) apply false in der Datei build.gradle.kts auf oberster Ebene im Block „plugins“ hinzu.
  5. Erstellen Sie zum Erstellen des myFusedLibrary-Moduls ein neues Verzeichnis mit dem Namen myFusedLibrary. Klicken Sie dazu mit der rechten Maustaste auf „Meine Anwendung“ > „Neu“ > „Verzeichnis“.
  6. Erstellen Sie im myFusedLibrary-Modul eine build.gradle.kts-Datei. Klicken Sie dazu mit der rechten Maustaste auf das myFusedLibrary-Modul und wählen Sie „Neu“ > „Datei“ aus.
  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 Hauptfunktion der verschmolzenen 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 Abhängigkeiten anzugeben, die gepackt werden sollen. 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

Sie sollten sich mit dem Veröffentlichen einer Android-Bibliothek vertraut machen, bevor Sie eine verschmolzene Bibliothek veröffentlichen. Das Veröffentlichen einer verschmolzenen Bibliothek ähnelt dem Veröffentlichen einer Android-Bibliothek. Es gibt jedoch einige wichtige Unterschiede, die Sie beachten müssen, um die verschmolzene Bibliothek richtig zu veröffentlichen:

  • Das Maven-Veröffentlichungs-Plug-in muss auch auf alle Module angewendet werden, auf die das Fused Library-Plug-in angewendet wurde.
  • Die Publikation muss von der fusedLibraryComponent erben, da diese die erforderlichen Abhängigkeiten zum Kompilieren des zusammengeführten Bibliotheks-Artefakts 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 '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
        }
    }
}

Ihre fusionierte Bibliothek zum Testen veröffentlichen

Sie sollten die Abhängigkeit von einer veröffentlichten verschmolzenen Bibliothek aus einer Android-App oder einer Android-Bibliothek testen. Wir empfehlen, die verschmolzene 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 ähnliche Konfiguration wie die folgende:

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 Bibliothek hochladen

Informationen zum Verteilen Ihrer zusammengeführten Mediathek finden Sie unter Mediathek hochladen.

Verhalten und Schutzmaßnahmen

Die Kombination von Android-Bibliotheken ist nicht ganz einfach und kann es für das Plug-in schwierig machen, Prioritäten zu setzen. Wenn beispielsweise zwei Bibliotheken mit derselben Klassenpfaddatei zusammengeführt werden, führt dies zu einem Build-Fehler. Bei der Zusammenführung von Ressourcen wird die Reihenfolge der Abhängigkeiten berücksichtigt, die bei der Auswahl 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 Datenbindung verwenden, wird nicht unterstützt.
  • Sie können nicht mehrere Buildtypen und Produktvarianten in einer einzigen zusammengeführten Bibliothek zusammenführen. Erstellen Sie separate Fusionsbibliotheken für verschiedene Varianten.

Um den erforderlichen Konfigurationsaufwand und die Nutzerfreundlichkeit in Einklang zu bringen, führt das Plug-in bei mehrdeutigen Konflikten entweder einen Buildfehler aus oder verwendet Heuristiken beim Zusammenführen von Artefakten. In der folgenden Tabelle finden Sie Details dazu, wie Artefakte zusammengeführt werden:

Eingeben Verhalten
Klassen Bibliotheken mit demselben Klassenpfad führen beim Zusammenführen der Bibliothek zu einem Buildfehler.
Android-Ressourcen Beim Zusammenführen von Ressourcen wird die Reihenfolge der Abhängigkeiten berücksichtigt, die bei der Auswahl einer Ressource mit demselben Namen in verschiedenen Dateien 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 Buildfehler.

Bekannte Probleme

Die Fusionsbibliothek ist ein neues Plug-in. Es gibt bekannte Probleme, an deren Behebung wir arbeiten, um alle Anwendungsfälle zu erfüllen.

  • lint.jar-Dateien sind nicht in der zusammengeführten AAR enthalten
  • Dateiabhängigkeiten von anderen .aar-Dateien hinzufügen
  • Keine Unterstützung für die Zusammenführung von RenderScript- und Prefab-Artefakten

Abhängigkeiten einer verschmolzenen Bibliothek

Die verschmolzene Bibliothek hat keine Quellen und verwendet 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 verschmolzene Bibliothek aus. Die Aufgaben generieren 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.