Android-Bibliothek erstellen

Eine Android-Bibliothek ist strukturell identisch mit einem Android-App-Modul. Sie 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, eine Android-Bibliothek in eine Android Archive-Datei (AAR) kompiliert, als Abhängigkeit für ein Android-App-Modul. Im Gegensatz zu JAR-Dateien AAR-Dateien bieten folgende Funktionen für Android-Apps:

  • AAR-Dateien können Android-Ressourcen und eine Manifestdatei enthalten, mit der können Sie außerdem gemeinsam genutzte Ressourcen wie Layouts und Drawables Kotlin- oder Java-Klassen und -Methoden.
  • AAR-Dateien können C/C++ Bibliotheken zur Verwendung durch den C/C++ Code des App-Moduls.

Ein Bibliotheksmodul ist in folgenden Situationen nützlich:

  • Beim Erstellen mehrerer Apps, die einige Komponenten wie Aktivitäten, Dienste oder UI-Layouts
  • Wenn Sie eine App erstellen, die in mehreren APK-Varianten verfügbar ist, z. B. eine kostenlose und eine kostenpflichtige Version, die die Hauptkomponenten

Verschieben Sie in beiden Fällen die Dateien, die Sie wiederverwenden möchten, in ein Bibliotheksmodul Fügen Sie dann die Bibliothek als Abhängigkeit für jedes App-Modul hinzu.

Auf dieser Seite wird erläutert, wie du eine Android-Bibliothek erstellst und verwendest -Modul. Eine Anleitung zum Veröffentlichen einer Bibliothek finden Sie unter Fotogalerie veröffentlichen

Bibliotheksmodul erstellen

So erstellen Sie ein neues Bibliotheksmodul in Ihrem Projekt:

  1. Klicken Sie auf Datei > Neu > Neues Modul.
  2. Gehen Sie im Dialogfeld Create New Module (Neues Modul erstellen) wie folgt vor: Klicken Sie auf Android-Bibliothek und dann auf Weiter.

    Sie können auch eine Kotlin- oder Java-Bibliothek erstellen, mit der eine herkömmliche JAR-Datei erstellt wird. Auch wenn eine JAR-Datei für viele besonders, wenn Sie Code mit anderen Plattformen: Sie können nicht Android-Ressourcen oder -Manifeste -Dateien, was für die Wiederverwendung von Code in Android-Projekten sehr nützlich ist. Dieser Leitfaden konzentriert sich auf das Erstellen von Android-Bibliotheken.

  3. Geben Sie Ihrer Bibliothek einen Namen und wählen Sie eine SDK-Mindestversion für den Code aus in der Bibliothek und klicken Sie dann auf Fertigstellen. <ph type="x-smartling-placeholder">

Nach Abschluss der Synchronisierung des Gradle-Projekts wird das Bibliotheksmodul in im Bereich Projekt. Wenn Sie das neue Modul nicht sehen, muss die Android-Ansicht angezeigt werden.

App-Modul in Bibliotheksmodul konvertieren

Wenn Sie bereits ein App-Modul mit Code haben, den Sie wiederverwenden möchten, können Sie sie folgendermaßen in ein Bibliotheksmodul umwandeln:

  1. Öffnen Sie die Datei build.gradle auf Modulebene, wenn Sie Groovy oder die Datei build.gradle.kts, wenn Sie Kotlin verwenden .
  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 Datei > Projekt mit Gradle-Dateien synchronisieren

Der Aufbau des Moduls ist gleich geblieben, die als Android-Bibliothek fungiert. Der Build erstellt eine AAR-Datei anstelle eines APKs.

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

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

Im Dialogfeld Projektstruktur können Sie Abhängigkeiten Projekt arbeiten. In den folgenden Abschnitten wird beschrieben, wie Sie über das Dialogfeld Abhängigkeiten.

Bibliothek innerhalb desselben Projekts verwenden

So verwenden Sie den Code Ihrer neuen Android-Bibliothek in einer anderen App oder einem anderen Bibliotheksmodul innerhalb desselben Projekts, fügen Sie eine Abhängigkeit auf Projektebene hinzu:

  1. Gehen Sie zu Datei > Projekt. Struktur > 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 Module Dependency (Modulabhängigkeit) aus dem Menü aus.

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

    Modulabhängigkeit in der Projektstruktur hinzufügen
Dialogfeld

  5. Wählen Sie die Konfiguration aus, die diese Abhängigkeit erfordert, oder wählen Sie Implementation (Implementierung) – wenn dies für alle Konfigurationen gilt. Klicken Sie dann auf OK.

Android Studio bearbeitet die build.gradle- oder build.gradle.kts-Datei Ihres Moduls zu fügen Sie die Abhängigkeit im folgenden Format hinzu:

Cool

  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 Central oder durch eine Verzeichnisstruktur auf Ihrer lokalen Festplatte. Weitere Informationen zur Verwendung Maven-Repositories, siehe Remote- Repositories.

Wenn eine Android-Bibliothek in einem Maven-Repository veröffentlicht wird, werden Metadaten enthalten, sodass die Abhängigkeiten der Bibliothek im verwendenden Build. So kann die Bibliothek automatisch dedupliziert werden, wenn wird er an mehreren Stellen verwendet.

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

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

  3. Verwenden Sie im Dialogfeld Bibliotheksabhängigkeit hinzufügen das Suchfeld, um nach dem Bibliothek hinzufügen. Mit diesem Formular werden die in der im dependencyResolutionManagement { repositories {...}}-Block im Feld settings.gradle- oder settings.gradle.kts-Datei.

    Bibliotheksabhängigkeit in der Projektstruktur hinzufügen
Dialogfeld

  4. Wählen Sie die Konfiguration aus, die diese Abhängigkeit erfordert, oder wählen Sie Implementation (Implementierung) – wenn dies für alle Konfigurationen gilt. Klicken Sie dann auf OK.

In der build.gradle- oder build.gradle.kts-Datei Ihrer App muss Folgendes bestätigt werden: Deklaration wie die Folgende angezeigt wird (abhängig von der Build-Konfiguration ausgewählt):

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. Gehen Sie zu Datei > Projektstruktur > Abhängigkeiten.
  2. Klicken Sie auf dem Tab Deklarierte Abhängigkeiten auf und wählen Sie Jar. Abhängigkeit aus.

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

    AAE-Abhängigkeit in der Projektstruktur hinzufügen
Dialogfeld

    In der build.gradle- oder build.gradle.kts-Datei Ihrer App muss Folgendes bestätigt werden: Deklaration wie die Folgende angezeigt wird (abhängig von der Build-Konfiguration ausgewählt):

    Cool

      implementation files('my_path/my_lib.aar')
    

    Kotlin

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

So importieren Sie eine Abhängigkeit vom Gradle-Build, der außerhalb von Android Studio ausgeführt wird: fügen Sie einen Pfad zur Abhängigkeit in die build.gradle- oder build.gradle.kts-Datei Ihrer App. 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 Fügen Sie Build-Abhängigkeiten hinzu.

Öffentliche Ressource deklarieren

Zu den Ressourcen gehören alle Dateien im Verzeichnis res/ Ihres Projekts. wie Bilder. Alle Ressourcen in einer Bibliothek sind standardmäßig auf „Öffentlich“ gesetzt. Um alle Ressourcen implizit privat sind, müssen Sie mindestens ein spezifisches Attribut definieren öffentlich zugänglich sind.

Fügen Sie eine <public>-Deklaration hinzu, um eine öffentliche Ressource zu deklarieren in die public.xml-Datei deiner Mediathek ein. Wenn Sie noch nicht die Option „Öffentlich“ Ressourcen erstellen möchten, müssen Sie die Datei public.xml im res/values/-Verzeichnis deiner Mediathek.

Der folgende Beispielcode erstellt zwei öffentliche String-Ressourcen mit der Namen mylib_app_name und mylib_public_string:

<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

Um zu verhindern, dass Nutzer Ihrer Bibliothek auf Nur für den internen Gebrauch, verwenden Sie diese automatische Kennzeichnung als privat durch die Deklaration einer oder mehrerer öffentlicher Ressourcen. Alternativ können Sie alle Ressourcen privat bleiben, indem Sie ein leeres <public />-Tag hinzufügen. Dieses nichts als öffentlich markiert und alle Ressourcen privat machen.

Alle Ressourcen, für die Sie sichtbar bleiben möchten Entwickler, die Ihre Bibliothek verwenden, sollten veröffentlicht werden.

Wenn Sie Attribute implizit als privat festlegen, werden Nutzer Ihrer Bibliothek verhindert vom Erhalt von Vorschlägen zur Codevervollständigung aus internen Bibliotheksressourcen und ermöglicht es Nutzern, private Ressourcen umzubenennen oder zu entfernen, ohne dass Ihrer Bibliothek enthält. Private Ressourcen werden aus der Codevervollständigung herausgefiltert, und das Lint-Tool warnt Sie, wenn Sie auf eine private Ressource verweisen.

Beim Erstellen einer Bibliothek ruft das Android-Gradle-Plug-in die öffentliche Ressource ab und extrahiert sie in die Datei public.txt, die die in die AAR-Datei verpackt werden.

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

    Wenn Sie Ihrem Android-App-Modul Verweise auf Bibliotheksmodule hinzugefügt haben, können Sie die relative Priorität festlegen. Bei der Erstellung Bibliotheken werden nacheinander mit der App zusammengeführt, beginnend mit der niedrigsten die höchste Priorität ein.

  • Konflikte beim Zusammenführen von Ressourcen vermeiden.

    Mit den Build-Tools werden Ressourcen aus einem Bibliotheksmodul mit denen eines abhängiges App-Modul. Wenn eine bestimmte Ressourcen-ID in beiden Modulen definiert ist, Ressource aus der App verwendet.

    Bei Konflikten zwischen mehreren AAR-Bibliotheken die an erster Stelle in der Liste der Abhängigkeiten (am Anfang dependencies-Block) verwendet wird.

    Verwenden Sie zur Vermeidung von Ressourcenkonflikten <ph type="x-smartling-placeholder"></ph> nicht transitive R-Klassen. Wenn dies nicht möglich ist, sollten Sie die Verwendung eines -Präfix oder ein anderes einheitliches Benennungsschema verwendet, das für das Modul eindeutig ist (oder einzigartig in allen Projektmodulen ist).

  • In Builds mit mehreren Modulen werden JAR-Abhängigkeiten so behandelt wie transitive Abhängigkeiten.

    Wenn Sie eine JAR-Abhängigkeit zu einem Bibliotheksprojekt hinzufügen, das ein AAR ausgibt, wird die JAR-Datei vom Bibliotheksmodul verarbeitet und mit dem zugehörigen AAR verpackt.

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

    Alle durch lokale JAR-Abhängigkeiten verursachten Java-Ressourcenkonflikte müssen behoben werden. im App-Modul, 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 für ein Ziel, 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.

  • Die minSdkVersion des App-Moduls muss gleich oder sein ist größer als die von der Bibliothek definierte Version.

    Eine Bibliothek wird als Teil des abhängigen App-Moduls kompiliert, sodass die verwendeten APIs im Bibliotheksmodul muss mit der Plattformversion kompatibel sein, die die App 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, die dann zum App-Modul hinzugefügt wird. Daher hat jede Bibliothek eine eigene R-Klasse, benannt nach dem Paketnamen der Bibliothek.

    Die aus dem Hauptmodul und dem Bibliotheksmodul generierte Klasse R ist in allen erforderlichen Paketen erstellt, einschließlich des Pakets des Hauptmoduls und die Bibliotheken Pakete.

  • Ein Bibliotheksmodul kann eine eigene ProGuard-Konfiguration enthalten -Datei.

    Wenn Sie ein Bibliotheksprojekt haben, mit dem Sie automatisch angewendete Empfehlungen erstellen und veröffentlichen, können Sie der Build-Konfiguration Ihrer Bibliothek eine ProGuard-Konfigurationsdatei hinzufügen. Wenn Sie 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 die Bibliothek ein -Modul. Wenn Sie die Bibliothek einem App-Modul hinzufügen, wird die ProGuard-Datei der Bibliothek wird an die ProGuard-Konfigurationsdatei (proguard.txt) von angehängt das App-Modul.

    Durch das Einbetten einer ProGuard-Datei in Ihr Bibliotheksmodul App-Module, die von Ihrer Bibliothek abhängig sind, ihre ProGuard-Dateien, um Ihre Bibliothek zu verwenden. Wenn das Android Studio-Build-System Ihrer App verwenden, werden die Anweisungen des App-Moduls und der Bibliothek verwendet. Also ist es nicht notwendig, einen Code-Shrinker für die Bibliothek in einem separaten Schritt auszuführen.

    Um Ihrem Bibliotheksprojekt die ProGuard-Regeln hinzuzufügen, geben Sie die Dateinamen mit dem Attribut consumerProguardFiles im defaultConfig-Block des build.gradle deiner Bibliothek oder build.gradle.kts-Datei.

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

    Cool

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

    Kotlin

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

    Ist Ihr Bibliotheksmodul jedoch Teil eines Builds mit mehreren Modulen, in ein APK kompiliert und keinen AAE generiert, Code ausführen Verkleinert wird nur auf das App-Modul, das die Bibliothek nutzt. Weitere Informationen mehr über die ProGuard-Regeln und deren Verwendung, Reduzieren, verschleiern und optimieren Sie App.

  • Das Testen eines Bibliotheksmoduls ist fast genauso Apps testen

    Der Hauptunterschied besteht darin, dass die Bibliothek und ihre Abhängigkeiten automatisch als Abhängigkeiten des Test-APKs eingefügt. Das bedeutet, dass Das Test-APK enthält nicht nur seinen eigenen Code, sondern auch den AAE der Bibliothek und allen zugehörigen Abhängigkeiten. Da keine separate App getestet wird, Mit der Aufgabe „androidTest“ wird nur der Test installiert (und deinstalliert) APK

    Beim Zusammenführen Manifestdateien hat, folgt Gradle die standardmäßige 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 aar. Die Datei selbst ist eine ZIP-Datei. Der einzige obligatorische Eintrag ist /AndroidManifest.xml

Eine AAE-Datei kann außerdem eines oder mehrere der folgenden optionalen Attribute enthalten: Einträge: