Eine Android-Bibliothek ist strukturell mit einem Android-App-Modul identisch. Es enthält alles, was zum Erstellen einer App erforderlich ist, einschließlich Quellcode, Ressourcendateien und einem Android-Manifest.
Anstatt jedoch in ein APK zu kompilieren, das auf einem Gerät ausgeführt wird, wird eine Android-Bibliothek in eine Android Archive-Datei (AAR) kompiliert, die Sie als Abhängigkeit für ein Android-App-Modul verwenden können. Im Gegensatz zu JAR-Dateien bieten AAR-Dateien folgende Funktionen für Android-Apps:
- AAR-Dateien können Android-Ressourcen und eine Manifestdatei enthalten. So können Sie neben Kotlin- oder Java-Klassen und ‑Methoden auch freigegebene Ressourcen wie Layouts und Drawables bündeln.
- AAR-Dateien können C/C++-Bibliotheken enthalten, die vom C/C++-Code des App-Moduls verwendet werden.
Ein Bibliotheksmodul ist in folgenden Situationen nützlich:
- Wenn Sie mehrere Apps erstellen, die einige derselben Komponenten verwenden, z. B. Aktivitäten, Dienste oder UI-Layouts
- Bei der Erstellung einer App, die in mehreren APK-Varianten verfügbar ist (z. B. eine kostenlose und eine kostenpflichtige Version) mit gemeinsamen Kernkomponenten
In beiden Fällen verschieben Sie 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 Datei > Neu > Neues Modul.
- Klicken Sie im Dialogfeld Create New Module (Neues Modul erstellen) auf Android Library (Android-Bibliothek) und dann auf Next (Weiter).
Es gibt auch die Möglichkeit, eine Kotlin- oder Java-Bibliothek zu erstellen, aus der eine herkömmliche JAR-Datei erstellt wird. JAR-Dateien sind zwar für viele Projekte nützlich, insbesondere wenn Sie Code für andere Plattformen freigeben möchten, aber Sie können damit keine Android-Ressourcen oder Manifestdateien einschließen, was für die Codewiederverwendung in Android-Projekten sehr nützlich ist. In diesem Leitfaden liegt der Schwerpunkt auf der Erstellung von Android-Bibliotheken.
- Geben Sie Ihrer Bibliothek einen Namen und wählen Sie eine Mindest-SDK-Version für den Code in der Bibliothek aus. Klicken Sie dann auf Fertigstellen.
Nach Abschluss der Synchronisierung des Gradle-Projekts wird das Bibliotheksmodul im Bereich Project angezeigt. Wenn Sie den neuen Modulordner nicht sehen, prüfen Sie, ob im Bereich die Ansicht Android angezeigt wird.
App-Modul in Bibliotheksmodul konvertieren
Wenn Sie bereits ein Anwendungsmodul mit Code haben, den Sie wiederverwenden möchten, können Sie es so in ein Bibliotheksmodul umwandeln:
- Öffnen Sie die Datei
build.gradle
auf Modulebene, wenn Sie Groovy verwenden, oder die Dateibuild.gradle.kts
, wenn Sie Kotlin-Script verwenden. - Löschen Sie die Zeile für
applicationId
. Dies kann nur in einem Android-App-Modul definiert werden. - Suchen Sie oben in der Datei nach dem Block „plugins“, der so aussieht:
Cool
plugins { id 'com.android.application' }
Kotlin
plugins { id("com.android.application") }
Ändern Sie sie in Folgendes:
Groovy
plugins { id 'com.android.library' }
Kotlin
plugins { id("com.android.library") }
- Speichern Sie die Datei und klicken Sie auf Datei > Projekt mit Gradle-Dateien synchronisieren.
Die Struktur des Moduls bleibt gleich, es wird jetzt aber als Android-Bibliothek ausgeführt. Beim Build wird eine AAR-Datei anstelle eines APK erstellt.
Wenn Sie die AAR-Datei erstellen möchten, wählen Sie im Fenster Projekt das Bibliotheksmodul aus und klicken Sie auf Build > Build APK.
Abhängigkeiten über das Dialogfeld „Project Structure“ (Projektstruktur) hinzufügen
Im Dialogfeld Projektstruktur können Sie Abhängigkeiten zu Ihrem Projekt hinzufügen. In den folgenden Abschnitten wird beschrieben, wie Sie über das Dialogfeld Abhängigkeiten hinzufügen.
Bibliothek innerhalb desselben Projekts verwenden
Wenn Sie den Code Ihrer neuen Android-Bibliothek in einer anderen App oder einem anderen Bibliotheksmodul innerhalb desselben Projekts verwenden möchten, fügen Sie eine Abhängigkeit auf Projektebene hinzu:
- Klicken Sie auf Datei > Projektstruktur > Abhängigkeiten.
- Wählen Sie das Modul aus, dem Sie die Bibliothek hinzufügen möchten.
- Klicken Sie auf dem Tab Angekündigte Abhängigkeiten auf und wählen Sie im Menü Modulabhängigkeit aus.
Wählen Sie im Dialogfeld Add Module Dependency (Modulabhängigkeit hinzufügen) das Bibliotheksmodul aus.
Wählen Sie die Konfiguration aus, für die diese Abhängigkeit erforderlich ist, oder Implementierung, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.
In Android Studio wird die Datei build.gradle
oder build.gradle.kts
Ihres Moduls bearbeitet, um die Abhängigkeit in folgender 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 bei einem Dienst wie Maven Central gehostet wird oder eine Verzeichnisstruktur auf Ihrem lokalen Laufwerk 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 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:
- Klicken Sie auf Datei > Projektstruktur > Abhängigkeiten.
- Klicken Sie auf dem Tab Angekündigte Abhängigkeiten auf und wählen Sie im Menü Bibliotheksabhängigkeit aus.
Suchen Sie im Dialogfeld Add Library Dependency (Bibliotheksabhängigkeit hinzufügen) im Suchfeld nach der Bibliothek, die Sie hinzufügen möchten. Mit diesem Formular werden die Repositories durchsucht, die im Block
dependencyResolutionManagement { repositories {...}}
der Dateisettings.gradle
odersettings.gradle.kts
angegeben sind.Wählen Sie die Konfiguration aus, für die diese Abhängigkeit erforderlich ist, oder Implementierung, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.
Prüfen Sie die build.gradle
- oder build.gradle.kts
-Datei Ihrer App, um sicherzustellen, dass eine Erklärung ähnlich der folgenden angezeigt wird (je nach ausgewählter Build-Konfiguration):
Cool
implementation 'com.example:examplelibrary:1.0.0'
Kotlin
implementation("com.example:examplelibrary:1.0.0")
AAR oder JAR als Abhängigkeit hinzufügen
So verwenden Sie den Code Ihrer Android-Bibliothek in einem anderen App-Modul:
- Wählen Sie Datei > Project Structure > Dependencies (Datei > Projektstruktur > Abhängigkeiten) aus.
- Klicken Sie auf dem Tab Deklarierte Abhängigkeiten auf und wählen Sie im Menü Jar-Abhängigkeit aus.
Geben Sie im Dialogfeld 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 Implementierung aus.
Prüfen Sie, ob in der Datei
build.gradle
oderbuild.gradle.kts
Ihrer Anwendung je nach ausgewählter Build-Konfiguration eine Deklaration wie diese angezeigt wird:Groovy
implementation files('my_path/my_lib.aar')
Kotlin
implementation(files("my_path/my_lib.aar"))
Wenn Sie eine Abhängigkeit in den Gradle-Build importieren möchten, der außerhalb von Android Studio ausgeführt wird, fügen Sie in der build.gradle
- oder build.gradle.kts
-Datei Ihrer App einen Pfad zur Abhängigkeit 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
Zu den Ressourcen gehören alle Dateien im res/
-Verzeichnis Ihres Projekts, z. B. Bilder. Alle Ressourcen in einer Bibliothek sind standardmäßig auf „Öffentlich“ gesetzt. Wenn Sie alle Ressourcen implizit als privat kennzeichnen möchten, müssen Sie mindestens ein bestimmtes Attribut als öffentlich definieren.
Wenn du eine öffentliche Ressource deklarieren möchtest, füge der public.xml
-Datei deiner 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 Stringressourcen 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 Mechanismus zur automatischen Benennung als privat. Deklarieren Sie dazu eine oder mehrere öffentliche Ressourcen. Alternativ können Sie alle Ressourcen privat machen, indem Sie ein leeres <public />
-Tag hinzufügen. Dadurch wird nichts als öffentlich gekennzeichnet und alle Ressourcen werden privat.
Alle Ressourcen, die für Entwickler, die Ihre Bibliothek verwenden, sichtbar bleiben sollen, müssen veröffentlicht werden.
Wenn Sie Attribute implizit privat machen, erhalten Nutzer Ihrer Bibliothek keine Vorschläge zur Codevervollständigung aus internen Bibliotheksressourcen. Außerdem können Nutzer private Ressourcen umbenennen oder entfernen, ohne dass Clients Ihrer Bibliothek beeinträchtigt werden. Private Ressourcen werden aus der Codevervollständigung 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 öffentlichen Ressourcendefinitionen ab und extrahiert sie in die public.txt
-Datei, die dann in der AAR-Datei verpackt wird.
Entwicklungsüberlegungen für Bibliotheksmodule
Beachten Sie bei der Entwicklung Ihrer Bibliotheksmodule und abhängigen Apps die folgenden Verhaltensweisen und Einschränkungen.
Bibliotheken werden in der Reihenfolge ihrer Priorität zusammengeführt.
Nachdem du deinem Android-App-Modul Verweise auf Bibliotheksmodule hinzugefügt hast, kannst du deren relative Priorität festlegen. Beim Build werden die Bibliotheken nacheinander mit der App zusammengeführt, beginnend mit der niedrigsten Priorität.
Vermeiden Sie Konflikte bei der Zusammenführung von Ressourcen.
Die Build-Tools führen Ressourcen aus einem Bibliotheksmodul mit denen eines abhängigen Anwendungsmoduls zusammen. Wenn eine bestimmte Ressourcen-ID 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 zuerst in der Liste der Abhängigkeiten aufgeführt ist (am Anfang des
dependencies
-Blocks).Verwenden Sie nicht transitive
R
-Klassen, um Ressourcenkonflikte zu vermeiden. Wenn dies nicht möglich ist, können Sie ein Präfix oder ein anderes einheitliches Benennungsschema verwenden, das für das Modul 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 eine AAR ausgibt, eine JAR-Abhängigkeit hinzufügen, wird die JAR vom Bibliotheksmodul verarbeitet und mit der 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 transitive Abhängigkeit. In diesem Fall wird die lokale JAR von dem Anwendungsmodul 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 für ein Ziel erstellt werden, das die externe Bibliothek enthält.
Sowohl das Bibliotheksmodul als auch die abhängige Anwendung müssen die externe Bibliothek in ihren Manifestdateien in einem
<uses-library>
-Element deklarieren.Die
minSdkVersion
des App-Moduls muss der von der Bibliothek definierten Version entsprechen oder höher 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.
Für jedes Bibliotheksmodul wird eine eigene
R
-Klasse erstellt.Wenn Sie die abhängigen App-Module erstellen, werden Bibliotheksmodule in eine AAR-Datei kompiliert und 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 Klasse
R
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 eine AAR erstellen und veröffentlichen, können Sie der Build-Konfiguration Ihrer Bibliothek eine ProGuard-Konfigurationsdatei hinzufügen. In diesem Fall werden die von Ihnen angegebenen ProGuard-Regeln vom Android Gradle-Plug-in angewendet. 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.Durch das Einbetten einer ProGuard-Datei in dein Bibliotheksmodul trägst du dazu bei, dass App-Module, die von deiner Bibliothek abhängen, ihre ProGuard-Dateien nicht manuell aktualisieren müssen, um deine Bibliothek zu verwenden. Wenn das Android Studio-Build-System Ihre App erstellt, werden die Anweisungen sowohl aus dem App-Modul als auch aus der Bibliothek verwendet. Es ist also nicht notwendig, in einem separaten Schritt einen Code-Shrinker für die Bibliothek auszuführen.
Wenn Sie Ihrem Bibliotheksprojekt die ProGuard-Regeln hinzufügen möchten, geben Sie den Namen der Datei mit der Eigenschaft
consumerProguardFiles
im BlockdefaultConfig
der Dateibuild.gradle
oderbuild.gradle.kts
Ihrer Bibliothek an.Im folgenden Snippet wird beispielsweise
lib-proguard-rules.txt
als ProGuard-Konfigurationsdatei der Bibliothek festgelegt:Groovy
android { defaultConfig { consumerProguardFiles 'lib-proguard-rules.txt' } ... }
Kotlin
android { defaultConfig { consumerProguardFiles("lib-proguard-rules.txt") } ... }
Wenn das Bibliotheksmodul jedoch Teil eines Builds mit mehreren Modulen ist, das in ein APK kompiliert wird und kein AAR generiert, führen Sie den Code nur für das App-Modul aus, das die Bibliothek verwendet. Weitere Informationen zu ProGuard-Regeln und ihrer Verwendung finden Sie unter Anwendung verkleinern, verschleieren und optimieren.
-
Das Testen eines Bibliotheksmoduls entspricht fast dem Testen einer Anwendung.
Der Hauptunterschied besteht darin, dass die Bibliothek und ihre Abhängigkeiten automatisch als Abhängigkeiten des Test-APKs aufgenommen werden. Das bedeutet, dass das Test-APK nicht nur seinen eigenen Code, sondern auch die AAR der Bibliothek und alle zugehörigen Abhängigkeiten enthält. Da keine separate Test-App vorhanden ist, wird mit der
androidTest
-Aufgabe nur das Test-APK installiert (und deinstalliert).Beim Zusammenführen mehrerer Manifestdateien folgt Gradle der Standardprioritätsreihenfolge und führt das Manifest der Bibliothek in das Hauptmanifest des Test-APK zusammen.
Aufbau einer AAR-Datei
Die Dateiendung einer AAR-Datei ist .aar
und der Maven-Artefakttyp ist ebenfalls aar
. 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
(abi_name ist eine der von Android unterstützten ABIs)/proguard.txt
/lint.jar
/api.jar
/prefab/
zum Exportieren nativer Bibliotheken