Android-Bibliothek erstellen

Eine Android-Bibliothek ist strukturell identisch mit einem Android-App-Modul. Er enthält alles, was zum Erstellen einer App erforderlich ist, einschließlich Quellcode, Ressourcendateien und ein Android-Manifest.

Anstatt jedoch in ein APK zu kompilieren, das auf einem Gerät ausgeführt wird, wird eine Android-Bibliothek in eine Android-Archivdatei (AAR) 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 du zusätzlich zu Kotlin- oder Java-Klassen und -Methoden in freigegebenen Ressourcen wie Layouts und Drawables bündeln kannst.
  • AAR-Dateien können C/C++-Bibliotheken zur Verwendung durch den C/C++-Code des App-Moduls enthalten.

Ein Bibliotheksmodul ist in folgenden Situationen nützlich:

  • Wenn Sie mehrere Apps mit denselben Komponenten wie Aktivitäten, Dienste oder UI-Layouts erstellen,
  • beim Erstellen einer App, die in mehreren APK-Varianten mit gemeinsamen Kernkomponenten verfügbar ist (z. B. eine kostenlose und eine kostenpflichtige Version)

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 Anwendungsmodul hinzu.

Auf dieser Seite wird erläutert, wie Sie ein Android-Bibliotheksmodul erstellen und verwenden. Eine Anleitung zum Veröffentlichen einer Bibliothek findest du unter Mediathek veröffentlichen.

Bibliotheksmodul erstellen

So erstellen Sie ein neues Bibliotheksmodul in Ihrem Projekt:

  1. Klicken Sie auf File > New > New Module.
  2. Klicken Sie im Dialogfeld Neues Modul erstellen auf Android-Bibliothek und dann auf Weiter.

    Es ist auch möglich, eine Kotlin- oder Java-Bibliothek zu erstellen, mit der eine traditionelle JAR-Datei erstellt wird. Eine JAR-Datei ist zwar für viele Projekte nützlich, insbesondere wenn Sie Code mit anderen Plattformen teilen möchten. Sie können damit jedoch keine Android-Ressourcen oder Manifestdateien einbinden, was sehr nützlich für die Wiederverwendung von Code in Android-Projekten ist. In dieser Anleitung geht es vorrangig um das Erstellen von Android-Bibliotheken.

  3. Geben Sie einen Namen für Ihre Bibliothek ein, wählen Sie eine SDK-Mindestversion für den Code in der Bibliothek aus und klicken Sie dann auf Fertigstellen.

Sobald die Synchronisierung des Gradle-Projekts abgeschlossen ist, wird das Bibliotheksmodul im Bereich Project (Projekt) angezeigt. Wenn der neue Modulordner nicht angezeigt wird, prüfen Sie, ob im Bereich die Ansicht Android angezeigt wird.

App-Modul in ein Bibliotheksmodul konvertieren

Wenn Sie bereits ein Anwendungsmodul mit Code haben, den Sie wiederverwenden möchten, können Sie es so in ein Bibliotheksmodul umwandeln:

  1. Öffnen Sie die Datei build.gradle auf Modulebene, wenn Sie Groovy verwenden, oder die Datei build.gradle.kts, wenn Sie ein Kotlin-Script verwenden.
  2. Löschen Sie die Zeile für applicationId. Dies kann nur durch ein Android-App-Modul definiert werden.
  3. Suchen Sie den „plugins“-Block am Anfang der Datei, der wie folgt aussieht:

    Groovig

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

      plugins {
          id("com.android.application")
      }
      

    Ändern Sie es so:

    Groovig

      plugins {
          id 'com.android.library'
      }
      

    Kotlin

      plugins {
          id("com.android.library")
      }
      
  4. Speichern Sie die Datei und klicken Sie auf File > Sync Project with Gradle Files.

Die Struktur des Moduls bleibt gleich, aber es funktioniert jetzt als Android-Bibliothek. Der Build erstellt eine AAR-Datei anstelle eines APKs.

Wenn Sie die AAR-Datei erstellen möchten, wählen Sie im Fenster Projekt das Bibliotheksmodul aus und klicken Sie auf Erstellen > APK erstellen.

Abhängigkeiten über das Dialogfeld „Projektstruktur“ hinzufügen

Im Dialogfeld Projektstruktur können Sie Ihrem Projekt Abhängigkeiten hinzufügen. In den folgenden Abschnitten wird beschrieben, wie Sie das Dialogfeld zum Hinzufügen von Abhängigkeiten verwenden.

Bibliothek aus demselben Projekt 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:

  1. Gehen Sie zu Datei > Projektstruktur > Abhängigkeiten.
  2. Wählen Sie das Modul aus, dem Sie die Bibliothek hinzufügen möchten.
  3. Klicken Sie auf dem Tab Deklarierte Abhängigkeiten auf und wählen Sie aus dem Menü Modulabhängigkeit aus.

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

    Fügen Sie im Dialogfeld „Project Structure“ (Projektstruktur) eine Modulabhängigkeit hinzu.

  5. Wählen Sie die Konfiguration aus, die diese Abhängigkeit benötigt, oder wählen Sie Implementierung aus, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.

Android Studio bearbeitet die Datei build.gradle oder build.gradle.kts Ihres Moduls, um die Abhängigkeit im folgenden Format hinzuzufügen:

Groovig

  implementation project(path: ":example-library")

Kotlin

  implementation(project(":example-library"))

Bibliothek in anderen Projekten verwenden

Die empfohlene Methode zur Freigabe von Abhängigkeiten (JARs und AARs) ist ein Maven-Repository, das entweder auf einem Dienst wie Maven Central oder mit einer Verzeichnisstruktur auf Ihrem lokalen Laufwerk gehostet wird. 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 einbezogen, damit die Abhängigkeiten der Bibliothek im verarbeitenden Build enthalten sind. Dadurch kann die Bibliothek automatisch dedupliziert werden, wenn sie an mehreren Stellen verwendet wird.

Wenn Sie den Code Ihrer Android-Bibliothek in einem anderen App-Modul in einem anderen Projekt verwenden möchten, gehen Sie so vor:

  1. Gehen Sie zu Datei > Projektstruktur > Abhängigkeiten.
  2. Klicken Sie auf dem Tab Deklarierte Abhängigkeiten auf und wählen Sie im Menü Bibliotheksabhängigkeit aus.

  3. Verwenden Sie das Suchfeld im Dialogfeld Bibliotheksabhängigkeit hinzufügen, um die hinzuzufügende Bibliothek zu finden. Dieses Formular durchsucht die im dependencyResolutionManagement { repositories {...}}-Block in der Datei settings.gradle oder settings.gradle.kts angegebenen Repositories.

    Fügen Sie im Dialog
zur Projektstruktur eine Bibliotheksabhängigkeit

  4. Wählen Sie die Konfiguration aus, die diese Abhängigkeit benötigt, oder wählen Sie Implementierung aus, wenn sie für alle Konfigurationen gilt, und klicken Sie dann auf OK.

Prüfen Sie in der Datei build.gradle oder build.gradle.kts Ihrer App, ob je nach ausgewählter Build-Konfiguration eine Deklaration ähnlich der folgenden angezeigt wird:

Groovig

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

  implementation("com.example:examplelibrary:1.0.0")

AAR oder JAR als Abhängigkeit hinzufügen

Gehen Sie wie folgt vor, um den Code Ihrer Android-Bibliothek in einem anderen App-Modul zu verwenden:

  1. Gehen Sie zu Datei > Projektstruktur > Abhängigkeiten.
  2. Klicken Sie auf dem Tab Deklarierte Abhängigkeiten auf und wählen Sie im Menü Jar-Abhängigkeit aus.

  3. Geben Sie im Dialogfeld Jar/Aar-Abhängigkeit hinzufügen den Pfad zu Ihrer AAR- oder JAR-Datei ein und wählen Sie die Konfiguration aus, für die die Abhängigkeit gilt. Wenn die Bibliothek für alle Konfigurationen verfügbar sein soll, wählen Sie die Konfiguration für die Implementierung aus.

    Fügen Sie eine AAE-Abhängigkeit
im Dialogfeld für die Projektstruktur hinzu.

    Prüfen Sie in der Datei build.gradle oder build.gradle.kts Ihrer Anwendung, ob je nach ausgewählter Build-Konfiguration eine Deklaration ähnlich der folgenden angezeigt wird:

    Groovig

      implementation files('my_path/my_lib.aar')
    

    Kotlin

      implementation(files("my_path/my_lib.aar"))
    

Wenn Sie eine Abhängigkeit vom Gradle-Build importieren möchten, der außerhalb von Android Studio ausgeführt wird, fügen Sie in der Datei build.gradle oder build.gradle.kts Ihrer App einen Pfad zur Abhängigkeit hinzu. Beispiele:

Groovig

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 Verzeichnis res/ Ihres Projekts, z. B. Bilder. Alle Ressourcen in einer Bibliothek sind standardmäßig auf „Öffentlich“ gesetzt. Um alle Ressourcen implizit privat zu machen, müssen Sie mindestens ein spezifisches Attribut als öffentlich definieren.

Wenn du eine öffentliche Ressource deklarieren möchtest, musst du der Datei public.xml deiner Bibliothek eine <public>-Deklaration hinzufügen. Wenn Sie noch keine öffentlichen Ressourcen hinzugefügt haben, müssen Sie die Datei public.xml im Verzeichnis res/values/ Ihrer Bibliothek erstellen.

Mit dem 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 automatischen Mechanismus zur privaten Kennzeichnung. Dazu deklarieren Sie eine oder mehrere öffentliche Ressourcen. Alternativ können Sie alle Ressourcen als privat festlegen, indem Sie ein leeres <public />-Tag hinzufügen. Dadurch wird nichts als öffentlich markiert und alle Ressourcen sind privat.

Alle Ressourcen, die für Entwickler sichtbar sein sollen, die Ihre Bibliothek verwenden, sollten öffentlich gemacht werden.

Wenn Sie Attribute implizit als privat festlegen, erhalten Nutzer Ihrer Bibliothek keine Vorschläge zur Codevervollständigung von internen Bibliotheksressourcen. Außerdem können Nutzer private Ressourcen umbenennen oder entfernen, ohne dass die 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 Definitionen der öffentlichen Ressourcen ab und extrahiert sie in die Datei public.txt, die dann in die AAR-Datei verpackt wird.

Überlegungen zur Entwicklung von Bibliotheksmodulen

Beachten Sie bei der Entwicklung Ihrer Bibliotheksmodule und abhängigen Anwendungen die folgenden Verhaltensweisen und Einschränkungen.

  • Bibliotheken werden nach Priorität zusammengeführt.

    Nachdem Sie Ihrem Android-App-Modul Verweise auf Bibliotheksmodule hinzugefügt haben, können Sie deren relative Priorität festlegen. Zum Zeitpunkt der Build-Erstellung werden die Bibliotheken von der niedrigsten zur höchsten Priorität nacheinander mit der Anwendung zusammengeführt.

  • Vermeiden Sie Konflikte bei der Ressourcenzusammenführung.

    Mit den Build-Tools werden Ressourcen aus einem Bibliotheksmodul mit denen eines abhängigen Anwendungsmoduls zusammengeführt. Wenn eine bestimmte Ressourcen-ID in beiden Modulen definiert ist, wird die Ressource aus der Anwendung verwendet.

    Bei Konflikten zwischen mehreren AAR-Bibliotheken wird die Ressource aus der Bibliothek verwendet, die in der Abhängigkeitenliste zuerst aufgeführt ist (am Anfang des dependencies-Blocks steht).

    Verwenden Sie nicht-transitive R-Klassen, um Ressourcenkonflikte zu vermeiden. Wenn dies nicht möglich ist, sollten Sie ein Präfix oder ein anderes konsistentes Namensschema verwenden, das nur für das Modul (oder in allen Projektmodulen eindeutig) ist.

  • In 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 vom Bibliotheksmodul verarbeitet und mit dem AAR verpackt.

    Wenn Ihr Projekt jedoch ein Bibliotheksmodul enthält, das von einem Anwendungsmodul genutzt wird, behandelt das Anwendungsmodul die lokale JAR-Abhängigkeit der Bibliothek als transitive Abhängigkeit. In diesem Fall wird die lokale JAR vom Anwendungsmodul verarbeitet, das sie verwendet, und nicht vom Bibliotheksmodul. Dadurch werden inkrementelle Builds beschleunigt, die durch Änderungen am Code einer Bibliothek verursacht werden.

    Alle durch lokale JAR-Abhängigkeiten verursachten Java-Ressourcenkonflikte müssen in dem Anwendungsmodul gelöst werden, das die Bibliothek nutzt.

  • 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 Anwendung müssen die externe Bibliothek in ihren Manifestdateien in einem <uses-library>-Element deklarieren.

  • Der minSdkVersion des Anwendungsmoduls muss der von der Bibliothek definierten Version entsprechen oder größer sein.

    Eine Bibliothek wird als Teil des abhängigen Anwendungsmoduls kompiliert. Daher müssen die im Bibliotheksmodul verwendeten APIs mit der Plattformversion kompatibel sein, die vom Anwendungsmodul unterstützt wird.

  • Jedes Bibliotheksmodul erstellt eine eigene R-Klasse.

    Wenn Sie die abhängigen App-Module erstellen, werden die 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 benötigten 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 AAE 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.

    Durch das Einbetten einer ProGuard-Datei in Ihr Bibliotheksmodul sorgen Sie dafür, dass App-Module, die von Ihrer Bibliothek abhängen, ihre ProGuard-Dateien nicht manuell aktualisieren müssen, um Ihre Bibliothek zu verwenden. Wenn das Android Studio-Build-System deine App erstellt, verwendet es die Anweisungen sowohl aus dem App-Modul als auch aus der Bibliothek. Es ist also nicht nötig, in einem separaten Schritt einen Code Srinker für die Bibliothek auszuführen.

    Wenn Sie die ProGuard-Regeln in Ihr Bibliotheksprojekt aufnehmen möchten, geben Sie den Namen der Datei mit dem Attribut consumerProguardFiles im Block defaultConfig der Datei build.gradle oder build.gradle.kts Ihrer Bibliothek an.

    Das folgende Snippet legt beispielsweise lib-proguard-rules.txt als ProGuard-Konfigurationsdatei der Bibliothek fest:

    Groovig

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }

    Kotlin

    android {
        defaultConfig {
            consumerProguardFiles("lib-proguard-rules.txt")
        }
        ...
    }

    Wenn dein Bibliotheksmodul jedoch Teil eines Builds mit mehreren Modulen ist, das in ein APK kompiliert wird und kein AAE generiert, führe die Codeschrumpfung nur für das App-Modul aus, das die Bibliothek nutzt. Weitere Informationen zu ProGuard-Regeln und ihrer Verwendung finden Sie unter Anwendung verkleinern, verschleiern und optimieren.

  • Das Testen eines Bibliotheksmoduls ist fast identisch mit dem Testen einer Anwendung.

    Der Hauptunterschied besteht darin, dass die Bibliothek und ihre Abhängigkeiten automatisch als Abhängigkeiten des Test-APKs enthalten sind. Das bedeutet, dass das Test-APK nicht nur seinen eigenen Code enthält, sondern auch das AAE der Bibliothek und alle zugehörigen Abhängigkeiten. Da keine separate App getestet wird, wird mit der Aufgabe androidTest nur das Test-APK installiert (und deinstalliert).

    Beim Zusammenführen mehrerer Manifestdateien folgt Gradle der standardmäßigen Prioritätsreihenfolge und führt das Manifest der Bibliothek mit dem Hauptmanifest des Test-APKs 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. Die einzige obligatorische Eingabe ist /AndroidManifest.xml.

Eine AAR-Datei kann auch einen oder mehrere der folgenden optionalen Einträge enthalten: