Android-Bibliothek erstellen

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

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, mit denen Sie neben Kotlin- oder Java-Klassen und -Methoden auch gemeinsam genutzte Ressourcen wie Layouts und Drawables bündeln können.
  • AAR-Dateien können C/C++-Bibliotheken enthalten, die vom C/C++-Code des Anwendungsmoduls verwendet werden können.

Ein Bibliotheksmodul ist in folgenden Situationen nützlich:

  • Wenn Sie mehrere Apps mit denselben Komponenten wie Aktivitäten, Diensten oder
  • Bei der Erstellung einer App, die in mehreren APK-Varianten verfügbar ist (z. B. eine kostenlose und eine kostenpflichtige Version) mit gemeinsamen Kernkomponenten

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 finden Sie unter Bibliothek 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 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, die wiederum eine traditionelle JAR-Datei erstellt. Obwohl eine JAR-Datei für viele Projekte nützlich ist – insbesondere wenn Sie Code mit anderen Plattformen teilen möchten – können Sie keine Android-Ressourcen oder Manifestdateien einbinden, was für die Wiederverwendung von Code in Android-Projekten sehr nützlich ist. In diesem Leitfaden geht es vorrangig um das Erstellen von Android-Bibliotheken.

  3. Geben Sie Ihrer Bibliothek einen Namen und wählen Sie eine SDK-Mindestversion 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 der neue Modulordner nicht angezeigt wird, prüfen Sie, ob dort die Android-Ansicht 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:

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

    Cool

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

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

    Ändern Sie sie wie folgt:

    Cool

      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 (Datei > Projekt mit Gradle-Dateien synchronisieren).

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

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

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

  1. Klicken Sie auf 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 Modulabhängigkeit aus dem Menü aus.

  4. Wählen Sie im Dialogfeld Modulabhängigkeit hinzufügen das Bibliotheksmodul aus.

    Fügen Sie die Modulabhängigkeit im
Dialogfeld "Project Structure" (Projektstruktur) hinzu.

  5. Wählen Sie die Konfiguration aus, die diese Abhängigkeit erfordert, 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:

Cool

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

Kotlin

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

Bibliothek in anderen Projekten verwenden

Es wird empfohlen, Abhängigkeiten (JARs und AARs) mit einem Maven-Repository freizugeben, das entweder auf einem Dienst wie Maven Central oder über eine 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 eingeschlossen, sodass die Abhängigkeiten der Bibliothek im verarbeitenden Build enthalten sind. So 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. Klicken Sie auf 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 im Dialogfeld Bibliotheksabhängigkeit hinzufügen das Suchfeld, um die hinzuzufügende Bibliothek zu finden. Mit diesem Formular werden die Repositories durchsucht, die im Block dependencyResolutionManagement { repositories {...}} der Datei settings.gradle oder settings.gradle.kts angegeben sind.

    Fügen Sie die Bibliotheksabhängigkeit im Dialogfeld "Project Structure" (Projektstruktur) hinzu.

  4. Wählen Sie die Konfiguration aus, die diese Abhängigkeit erfordert, 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 wie diese angezeigt wird:

Cool

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

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

AAR oder JAR als Abhängigkeit hinzufügen

Um den Code Ihrer Android-Bibliothek in einem anderen App-Modul zu verwenden, gehen Sie so vor:

  1. Klicken Sie auf 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 Add Jar/Aar Dependency (Jar-/Aar-Abhängigkeit hinzufügen) den Pfad zur AAR- oder JAR-Datei ein und wählen Sie dann 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 Implementierungskonfiguration aus.

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

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

    Cool

      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 der Abhängigkeit in der Datei build.gradle oder build.gradle.kts Ihrer App einen Pfad hinzu. Beispiel:

Cool

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

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 die interne Verwendung bestimmt sind, können Sie diesen automatischen Mechanismus zur Kennzeichnung „Privat“ verwenden, indem Sie eine oder mehrere öffentliche Ressourcen deklarieren. Alternativ können Sie alle Ressourcen privat machen, indem Sie ein leeres <public />-Tag hinzufügen. Dadurch werden nichts als öffentlich markiert und alle Ressourcen werden privat.

Alle Ressourcen, die für Entwickler sichtbar bleiben 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 aus internen Bibliotheksressourcen. Außerdem können Nutzer private Ressourcen umbenennen oder entfernen, ohne die Clients Ihrer Bibliothek zu beeinträchtigen. Private Ressourcen werden aus der Codevervollständigung herausgefiltert. 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 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 du deinem Android-App-Modul Verweise auf Bibliotheksmodule hinzugefügt hast, kannst du deren relative Priorität festlegen. Bei der Build-Erstellung werden die Bibliotheken nacheinander mit der Anwendung zusammengeführt, beginnend von der niedrigsten zur höchsten Priorität.

  • Konflikte beim Zusammenführen von Ressourcen vermeiden.

    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 Anwendung verwendet.

    Bei Konflikten zwischen mehreren AAR-Bibliotheken wird die Ressource aus der Bibliothek verwendet, die an erster Stelle in der Abhängigkeitenliste steht (am Anfang des dependencies-Blocks am weitesten ganz oben steht).

    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 konsistentes Benennungsschema 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 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 Anwendungsmodul genutzt wird, behandelt das Anwendungsmodul 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. Dies beschleunigt inkrementelle Builds, die durch Änderungen am Code einer Bibliothek verursacht werden.

    Alle Java-Ressourcenkonflikte, die durch lokale JAR-Abhängigkeiten verursacht werden, müssen in dem Anwendungsmodul behoben werden, das die Bibliothek verbraucht.

  • 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 Anwendungsmoduls muss gleich oder größer als die von der Bibliothek definierte Version sein.

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

  • Für jedes Bibliotheksmodul wird eine eigene R-Klasse erstellt.

    Beim Erstellen der abhängigen App-Module 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 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 zum Erstellen und Veröffentlichen eines AAR verwenden, 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 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 deine App erstellt, verwendet es die Anweisungen aus dem App-Modul und der Bibliothek. Es ist also nicht notwendig, in einem separaten Schritt einen Code-Shrinker für die Bibliothek auszuführen.

    Wenn du deinem Bibliotheksprojekt die ProGuard-Regeln hinzufügen möchtest, gib den Namen der Datei mit dem Attribut consumerProguardFiles im defaultConfig-Block der build.gradle- oder build.gradle.kts-Datei deiner Bibliothek an.

    Im folgenden Snippet wird beispielsweise lib-proguard-rules.txt als ProGuard-Konfigurationsdatei der Bibliothek festgelegt:

    Cool

    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, verschleiern 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 einbezogen 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 App getestet wird, wird durch die 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.

Anatomie 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: