Eine Android-Bibliothek ist strukturell mit einem Android-App-Modul identisch. Sie enthält alles, was zum Erstellen einer App erforderlich ist, einschließlich Quellcode, Ressourcendateien und einem Android-Manifest.
Anstatt in ein APK kompiliert zu werden, das auf einem Gerät ausgeführt wird, wird eine Android-Bibliothek in eine AAR-Datei (Android-Archiv) kompiliert, die Sie als Abhängigkeit für ein Android-App-Modul verwenden können. Im Gegensatz zu JAR-Dateien bieten AAR-Dateien die folgenden Funktionen für Android-Apps:
- AAR-Dateien können Android-Ressourcen und eine Manifestdatei enthalten, mit der Sie neben Kotlin- oder Java-Klassen und -Methoden auch freigegebene Ressourcen wie Layouts und Drawables bündeln können.
- AAR-Dateien können C/C++ Bibliotheken enthalten, die vom C/C++-Code des App-Moduls verwendet werden.
Ein Bibliotheksmodul ist in den folgenden Situationen nützlich:
- Beim Erstellen mehrerer Apps, die einige der gleichen Komponenten verwenden, z. B. Aktivitäten, Dienste oder UI-Layouts
- Beim Erstellen einer App, die in mehreren APK-Varianten vorhanden ist, z. B. als kostenlose und kostenpflichtige Version, und die gemeinsame Kernkomponenten verwendet
Verschieben Sie in beiden Fällen die Dateien, die Sie wiederverwenden möchten, in ein Bibliotheksmodul und fügen Sie die Bibliothek dann als Abhängigkeit für jedes App-Modul hinzu.
Auf dieser Seite wird erläutert, wie Sie ein Android-Bibliotheksmodul erstellen und verwenden. Eine Anleitung zum Veröffentlichen einer Bibliothek finden Sie unter Bibliothek veröffentlichen.
Bibliotheksmodul erstellen
So erstellen Sie ein neues Bibliotheksmodul in Ihrem Projekt:
- Klicken Sie auf File > New > New Module (Datei > Neu > Neues Modul).
- Klicken Sie im angezeigten Dialogfeld Create New Module (Neues Modul erstellen)
auf Android Library (Android-Bibliothek) und dann auf Next (Weiter).
Sie können auch eine Kotlin- oder Java-Bibliothek erstellen, wodurch eine herkömmliche JAR-Datei erstellt wird. Eine JAR-Datei ist für viele Projekte nützlich, insbesondere wenn Sie Code für andere Plattformen freigeben möchten. Sie können in diese jedoch keine Android-Ressourcen oder Manifestdateien einfügen, was für die Wiederverwendung von Code in Android-Projekten sehr nützlich ist. In diesem Leitfaden geht es um das Erstellen von Android-Bibliotheken.
- Geben Sie der Bibliothek einen Namen und wählen Sie eine Mindest-SDK-Version für den Code in der Bibliothek aus. Klicken Sie dann auf Fertigstellen.
Nachdem die Gradle-Projektsynchronisierung abgeschlossen ist, wird das Bibliotheksmodul im Bereich Project (Projekt) angezeigt. Wenn der neue Modul ordner nicht angezeigt wird, prüfen Sie, ob im Bereich die Android Ansicht angezeigt wird.
App-Modul in ein Bibliotheksmodul umwandeln
Wenn Sie ein vorhandenes App-Modul mit Code haben, den Sie wiederverwenden möchten, können Sie es so in ein Bibliotheksmodul umwandeln:
- Öffnen Sie die Datei auf Modulebene
build.gradle, wenn Sie Groovy verwenden, oder die Dateibuild.gradle.kts, wenn Sie Kotlin-Skript verwenden. - Löschen Sie die Zeile für
applicationId. Nur ein Android-App-Modul kann dies definieren. - Suchen Sie oben in der Datei den Block `plugins`, der so aussieht:
Groovy
plugins { id 'com.android.application' }
Kotlin
plugins { id("com.android.application") }
Ändern Sie ihn wie folgt:
Groovy
plugins { id 'com.android.library' }
Kotlin
plugins { id("com.android.library") }
- Speichern Sie die Datei und klicken Sie auf File > Sync Project with Gradle Files (Datei > Projekt mit Gradle-Dateien synchronisieren).
Die Struktur des Moduls bleibt gleich, es funktioniert aber jetzt als Android-Bibliothek. Beim Build wird eine AAR-Datei anstelle eines APK erstellt.
Wenn Sie die AAR-Datei erstellen möchten, wählen Sie das Bibliotheksmodul im Project Fenster aus und klicken Sie auf Build > Build APK.
Abhängigkeiten über das Dialogfeld „Projektstruktur“ hinzufügen
Im Dialogfeld Project Structure (Projektstruktur) können Sie Ihrem Projekt Abhängigkeiten hinzufügen. In den folgenden Abschnitten wird beschrieben, wie Sie das Dialogfeld verwenden, um Abhängigkeiten hinzuzufügen.
Bibliothek im selben Projekt verwenden
Wenn Sie den Code Ihrer neuen Android-Bibliothek in einem anderen App- oder Bibliotheksmodul im selben Projekt verwenden möchten, fügen Sie eine Abhängigkeit auf Projektebene hinzu:
- Gehen Sie zu File > Project Structure > Dependencies (Datei > Projektstruktur > Abhängigkeiten).
- Wählen Sie das Modul aus, dem Sie die Bibliothek hinzufügen möchten.
- Klicken Sie auf dem Tab Declared Dependencies (Deklarierte Abhängigkeiten) auf
und wählen Sie im Menü Module Dependency (Modulabhängigkeit) aus.

Wählen Sie im Dialogfeld Add Module Dependency (Modulabhängigkeit hinzufügen) Ihr Bibliotheksmodul aus.

Wählen Sie die Konfiguration aus, für die diese Abhängigkeit erforderlich ist, oder wählen Sie implementation (Implementierung) aus, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.
In Android Studio wird die build.gradle- oder build.gradle.kts-Datei Ihres Moduls bearbeitet, um die Abhängigkeit in der folgenden Form hinzuzufügen:
Groovy
implementation project(path: ":example-library")
Kotlin
implementation(project(":example-library"))
Bibliothek in anderen Projekten verwenden
Die empfohlene Methode zum Freigeben von Abhängigkeiten (JARs und AARs) ist ein Maven-Repository, das entweder auf einem Dienst wie Maven Centralgehostet wird oder eine Verzeichnisstruktur auf Ihrer lokalen Festplatte hat. Weitere Informationen zur Verwendung von Maven-Repositories finden Sie unter Remote Repositories.
Wenn eine Android-Bibliothek in einem Maven-Repository veröffentlicht wird, werden Metadaten eingefügt, damit die Abhängigkeiten der Bibliothek in den verbrauchenden Build aufgenommen werden. So kann die Bibliothek automatisch dedupliziert werden, wenn sie an mehreren Stellen verwendet wird.
So verwenden Sie den Code Ihrer Android-Bibliothek in einem anderen App-Modul in einem anderen Projekt:
- Gehen Sie zu File > Project Structure > Dependencies (Datei > Projektstruktur > Abhängigkeiten)
- Klicken Sie auf dem Tab Declared Dependencies (Deklarierte Abhängigkeiten) auf
und wählen Sie im Menü Module Dependency (Modulabhängigkeit) aus.

Suchen Sie im Dialogfeld Add Library Dependency (Bibliotheksabhängigkeit hinzufügen) im Suchfeld nach der Bibliothek, die Sie hinzufügen möchten. In diesem Formular werden die in der in dem
dependencyResolutionManagement { repositories {...}}-Block in dersettings.gradle- odersettings.gradle.kts-Datei angegebenen Repositories durchsucht.
Wählen Sie die Konfiguration aus, für die diese Abhängigkeit erforderlich ist, oder wählen Sie implementation (Implementierung) aus, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.
Prüfen Sie in der build.gradle- oder build.gradle.kts-Datei Ihrer App, ob eine
Deklaration ähnlich der folgenden angezeigt wird (je nach ausgewählter Build-Konfiguration
):
Groovy
implementation 'com.example:examplelibrary:1.0.0'
Kotlin
implementation("com.example:examplelibrary:1.0.0")
AAR- oder JAR-Datei als Abhängigkeit hinzufügen
So verwenden Sie den Code Ihrer Android-Bibliothek in einem anderen App-Modul:
- Gehen Sie zu File > Project Structure > Dependencies (Datei > Projektstruktur > Abhängigkeiten)
- Klicken Sie auf dem Tab Declared Dependencies (Deklarierte Abhängigkeiten) auf
und wählen Sie im Menü Jar Dependency (Jar-Abhängigkeit) aus.

Geben Sie im Dialogfeld Add Jar/Aar Dependency (Jar-/Aar-Abhängigkeit hinzufügen) den Pfad zu Ihrer AAR- oder JAR-Datei ein und wählen Sie dann die Konfiguration aus, auf die sich die Abhängigkeit bezieht. Wenn die Bibliothek für alle Konfigurationen verfügbar sein soll, wählen Sie die Konfiguration implementation (Implementierung) aus.

Prüfen Sie in der
build.gradle- oderbuild.gradle.kts-Datei Ihrer App, ob eine Deklaration ähnlich der folgenden angezeigt wird (je nach ausgewählter Build-Konfiguration die Sie ausgewählt haben):Groovy
implementation files('my_path/my_lib.aar')
Kotlin
implementation(files("my_path/my_lib.aar"))
Wenn Sie eine Abhängigkeit vom Gradle-Build hinzufügen möchten, der außerhalb von Android Studio ausgeführt wird,
fügen Sie einen Pfad zur Abhängigkeit in
der build.gradle- oder build.gradle.kts-Datei Ihrer App hinzu. Beispiel:
Groovy
dependencies { implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) }
Kotlin
dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) }
Weitere Informationen zum Hinzufügen von Gradle-Abhängigkeiten finden Sie unter Build-Abhängigkeiten hinzufügen.
Öffentliche Ressource deklarieren
Ressourcen umfassen alle Dateien im Verzeichnis res/ Ihres Projekts, z. B. Bilder. Alle Ressourcen in einer Bibliothek sind standardmäßig öffentlich. Wenn Sie alle Ressourcen implizit als privat festlegen möchten, müssen Sie mindestens ein bestimmtes Attribut als öffentlich definieren.
Wenn Sie eine öffentliche Ressource deklarieren möchten, fügen Sie der public.xml Datei Ihrer Bibliothek eine <public> Deklaration
hinzu. Wenn Sie noch keine öffentlichen Ressourcen hinzugefügt haben, müssen Sie die Datei public.xml im Verzeichnis res/values/ Ihrer Bibliothek erstellen.
Im folgenden Beispielcode werden zwei öffentliche String-Ressourcen mit den Namen mylib_app_name und mylib_public_string erstellt:
<resources> <public name="mylib_app_name" type="string"/> <public name="mylib_public_string" type="string"/> </resources>
Wenn Sie verhindern möchten, dass Nutzer Ihrer Bibliothek auf Ressourcen zugreifen, die nur für den internen Gebrauch bestimmt sind, verwenden Sie diesen automatischen Mechanismus zur privaten Kennzeichnung, indem Sie eine oder mehrere öffentliche Ressourcen deklarieren. Alternativ können Sie
alle Ressourcen als privat festlegen, indem Sie ein leeres <public /> Tag hinzufügen. Dadurch wird nichts als öffentlich gekennzeichnet und alle Ressourcen werden als privat festgelegt.
Alle Ressourcen, die für Entwickler, die Ihre Bibliothek verwenden, sichtbar bleiben sollen, müssen öffentlich gemacht werden.
Wenn Sie Attribute implizit als privat festlegen, erhalten Nutzer Ihrer Bibliothek keine Vorschläge zur automatischen Vervollständigung von Code aus internen Bibliotheksressourcen. Außerdem können Nutzer private Ressourcen dadurch umbenennen oder entfernen, ohne dass Clients Ihrer Bibliothek dadurch beeinträchtigt werden. Private Ressourcen werden aus der automatischen Vervollständigung von Code herausgefiltert und das Lint-Tool warnt Sie, wenn Sie versuchen, auf eine private Ressource zu verweisen.
Beim Erstellen einer Bibliothek ruft das Android-Gradle-Plug-in die Definitionen der öffentlichen Ressourcen ab und extrahiert sie in die Datei public.txt, die dann in der AAR-Datei verpackt wird.
Entwicklungsüberlegungen für Bibliotheksmodule
Beachten Sie beim Entwickeln Ihrer Bibliotheksmodule und abhängigen Apps die folgenden Verhaltensweisen und Einschränkungen.
Bibliotheken werden in der Reihenfolge ihrer Priorität zusammengeführt.
Nachdem Sie Ihrem Android-App-Modul Verweise auf Bibliotheksmodule hinzugefügt haben, können Sie deren relative Priorität festlegen. Zur Build-Dauer werden die Bibliotheken nacheinander mit der App zusammengeführt, beginnend mit der niedrigsten Priorität bis zur höchsten.
Ressourcenverweise in einer Bibliothek verweisen auf die zusammengeführte Ressource, nicht unbedingt auf die Bibliotheksressource. Ein Bibliotheksmodul kann die Verwendung seiner eigenen Ressourcen nicht gegenüber denen der App oder anderer Bibliotheken erzwingen, wenn Ressourcen mit demselben Namen vorhanden sind.
Ressourcenkonflikte beim Zusammenführen vermeiden.
Die Build-Tools führen Ressourcen aus einem Bibliotheksmodul mit denen eines abhängigen App-Moduls zusammen. Wenn ein bestimmter Ressourcenname in beiden Modulen definiert ist, wird die Ressource aus der App verwendet.
Wenn Konflikte zwischen mehreren AAR-Bibliotheken auftreten, wird die Ressource aus der Bibliothek verwendet, die in der Liste der Abhängigkeiten zuerst aufgeführt ist (am nächsten am Anfang des Blocks
dependencies).Um Ressourcenkonflikte zu vermeiden, verwenden Sie ein Präfix oder ein anderes konsistentes Benennungsschema, das für das Modul eindeutig ist (oder für alle Projektmodule eindeutig ist).
Bei Builds mit mehreren Modulen werden JAR-Abhängigkeiten als transitive Abhängigkeiten behandelt.
Wenn Sie einem Bibliotheksprojekt, das ein AAR ausgibt, eine JAR-Abhängigkeit hinzufügen, wird die JAR-Datei vom Bibliotheksmodul verarbeitet und mit dem AAR verpackt.
Wenn Ihr Projekt jedoch ein Bibliotheksmodul enthält, das von einem App Modul verwendet wird, behandelt das App-Modul die lokale JAR-Abhängigkeit der Bibliothek als eine transitive Abhängigkeit. In diesem Fall wird die lokale JAR-Datei vom App Modul verarbeitet, das sie verwendet, und nicht vom Bibliotheksmodul. Dadurch werden inkrementelle Builds beschleunigt, die durch Änderungen am Code einer Bibliothek verursacht werden.
Alle Java-Ressourcenkonflikte, die durch lokale JAR-Abhängigkeiten verursacht werden, müssen im App-Modul behoben werden, das die Bibliothek verwendet.
Ein Bibliotheksmodul kann von einer externen JAR-Bibliothek abhängen.
Sie können ein Bibliotheksmodul entwickeln, das von einer externen Bibliothek abhängt. In diesem Fall muss das abhängige Modul mit einem Ziel erstellt werden, das die externe Bibliothek enthält.
Sowohl das Bibliotheksmodul als auch die abhängige App müssen die externe Bibliothek in ihren Manifestdateien in einem
<uses-library>-Element deklarieren.Die
minSdkVersiondes App-Moduls muss gleich oder größer als die von der Bibliothek definierte Version sein.Eine Bibliothek wird als Teil des abhängigen App-Moduls kompiliert. Daher müssen die im Bibliotheksmodul verwendeten APIs mit der Plattformversion kompatibel sein, die vom App-Modul unterstützt wird.
Jedes Bibliotheksmodul erstellt eine eigene
RKlasse.Wenn Sie die abhängigen App-Module erstellen, werden Bibliotheksmodule in eine AAR-Datei kompiliert und dann dem App-Modul hinzugefügt. Daher hat jede Bibliothek eine eigene
R-Klasse, die nach dem Paketnamen der Bibliothek benannt ist.Die aus dem Hauptmodul und dem Bibliotheksmodul generierte
R-Klasse wird in allen erforderlichen Paketen erstellt, einschließlich des Pakets des Hauptmoduls und der Pakete der Bibliotheken.Ein Bibliotheksmodul kann eine eigene ProGuard-Konfigurationsdatei enthalten.
Wenn Sie ein Bibliotheksprojekt haben, mit dem Sie ein AAR erstellen und veröffentlichen, können Sie der Build-Konfiguration Ihrer Bibliothek eine ProGuard-Konfigurationsdatei hinzufügen. In diesem Fall wendet das Android-Gradle-Plug-in die von Ihnen angegebenen ProGuard-Regeln an. Die Build-Tools betten diese Datei in die generierte AAR-Datei für das Bibliotheksmodul ein. Wenn Sie die Bibliothek einem App-Modul hinzufügen, wird die ProGuard-Datei der Bibliothek an die ProGuard-Konfigurationsdatei (
proguard.txt) des App-Moduls angehängt.Wenn Sie eine ProGuard-Datei in Ihr Bibliotheksmodul einbetten, müssen App-Module, die von Ihrer Bibliothek abhängen, ihre ProGuard-Dateien nicht manuell aktualisieren, um Ihre Bibliothek zu verwenden. Wenn das Android Studio-Buildsystem Ihre App erstellt, werden die Direktiven aus sowohl dem App-Modul als auch der Bibliothek verwendet. Daher ist es nicht erforderlich, für die Bibliothek in einem separaten Schritt eine Codekomprimierung durchzuführen.
Wenn Sie die ProGuard-Regeln Ihrem Bibliotheksprojekt hinzufügen möchten, geben Sie den Namen der Datei mit der
consumerProguardFilesProperty imdefaultConfigBlock derbuild.gradleoderbuild.gradle.ktsDatei Ihrer Bibliothek an.Im folgenden Snippet wird beispielsweise
lib-proguard-rules.txtals ProGuard-Konfigurationsdatei der Bibliothek festgelegt:Groovy
android { defaultConfig { consumerProguardFiles 'lib-proguard-rules.txt' } ... }
Kotlin
android { defaultConfig { consumerProguardFiles("lib-proguard-rules.txt") } ... }
Wenn Ihr Bibliotheksmodul jedoch Teil eines Builds mit mehreren Modulen ist, der in ein APK kompiliert wird und kein AAR generiert, führen Sie die Codekomprimierung nur für das App-Modul aus, das die Bibliothek verwendet. Weitere Informationen zu ProGuard-Regeln und ihrer Verwendung finden Sie unter App komprimieren, verschleiern und optimieren.
-
Das Testen eines Bibliotheksmoduls ist fast identisch mit dem Testen einer App.
Der Hauptunterschied besteht darin, dass die Bibliothek und ihre Abhängigkeiten automatisch als Abhängigkeiten des Test-APK enthalten sind. Das bedeutet, dass das Test-APK nicht nur seinen eigenen Code, sondern auch das AAR der Bibliothek und alle seine Abhängigkeiten enthält. Da es keine separate App gibt, die getestet wird, installiert (und deinstalliert) die
androidTestAufgabe nur das Test APK.Beim Zusammenführen mehrerer Manifestdateien folgt Gradle der Standardprioritätsreihenfolge und führt das Manifest der Bibliothek in das Hauptmanifest des Test-APK ein.
Aufbau einer AAR-Datei
Die Dateiendung für eine AAR-Datei ist .aar und der Maven-Artefakttyp ist
aar ebenfalls. Die Datei selbst ist eine ZIP-Datei. Der einzige obligatorische Eintrag ist /AndroidManifest.xml.
Eine AAR-Datei kann auch einen oder mehrere der folgenden optionalen Einträge enthalten:
/classes.jar/res//R.txt/public.txt/assets//libs/name.jar/jni/abi_name/name.so(wobei abi_name eines der von Android unterstützten ABIs ist)/proguard.txt/lint.jar/api.jar/prefab/zum Exportieren nativer Bibliotheken