Android-Bibliothek erstellen

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:

  1. Klicken Sie auf Datei > Neu > Neues Modul.
  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, 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.

  3. 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:

  1. Öffnen Sie die Datei build.gradle auf Modulebene, wenn Sie Groovy verwenden, oder die Datei build.gradle.kts, wenn Sie Kotlin-Script verwenden.
  2. Löschen Sie die Zeile für applicationId. Dies kann nur in einem Android-App-Modul definiert werden.
  3. 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")
      }
      
  4. 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:

  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 Angekündigte Abhängigkeiten auf und wählen Sie im Menü Modulabhängigkeit aus.

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

    Modulabhängigkeit im Dialogfeld „Projektstruktur“ hinzufügen

  5. 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:

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

  3. 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 Datei settings.gradle oder settings.gradle.kts angegeben sind.

    Bibliotheksabhängigkeit im Dialogfeld „Projektstruktur“ hinzufügen

  4. 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:

  1. Wählen Sie Datei > Project Structure > Dependencies (Datei > Projektstruktur > Abhängigkeiten) aus.
  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 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.

    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:

    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 Block defaultConfig der Datei build.gradle oder build.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: