Build-Abhängigkeiten hinzufügen

Mit dem Gradle-Build-System in Android Studio können Sie externe Binärdateien oder andere Bibliotheksmodule als Abhängigkeiten in Ihren Build einbinden. Die Abhängigkeiten können sich auf Ihrem Computer oder in einem Remote-Repository befinden. Alle deklarierten transitiven Abhängigkeiten werden ebenfalls automatisch einbezogen. Auf dieser Seite wird beschrieben, wie Sie Abhängigkeiten in Ihrem Android-Projekt verwenden. Außerdem finden Sie hier Details zu Verhaltensweisen und Konfigurationen, die für das Android Gradle-Plug-in (AGP) spezifisch sind. Eine ausführlichere konzeptionelle Anleitung zu Gradle-Abhängigkeiten finden Sie im Gradle-Leitfaden zur Abhängigkeitsverwaltung. Beachten Sie jedoch, dass Ihr Android-Projekt nur die auf dieser Seite definierten Abhängigkeitskonfigurationen verwenden darf.

Bibliotheks- oder Plug-in-Abhängigkeit hinzufügen

Build-Abhängigkeiten lassen sich am besten mit Versionskatalogen hinzufügen und verwalten. Diese Methode wird standardmäßig für neue Projekte verwendet. In diesem Abschnitt werden die gängigsten Konfigurationstypen für Android-Projekte behandelt. Weitere Optionen finden Sie in der Gradle-Dokumentation. Ein Beispiel für eine App, die Versionskataloge verwendet, finden Sie unter Now in Android. Wenn Sie bereits Build-Abhängigkeiten ohne Versionskataloge eingerichtet haben und ein Projekt mit mehreren Modulen haben, empfehlen wir die Migration.

Eine Anleitung zum Hinzufügen und Verwalten nativer Abhängigkeiten (nicht üblich) finden Sie unter Native Abhängigkeiten.

Im folgenden Beispiel werden dem Projekt eine Remote-Binärabhängigkeit (die Jetpack Macrobenchmark-Bibliothek), eine Abhängigkeit von einem lokalen Bibliotheksmodul (myLibrary) und eine Plug-in-Abhängigkeit (das Android-Gradle-Plug-in) hinzugefügt. So fügen Sie diese Abhängigkeiten Ihrem Projekt hinzu:

  1. Fügen Sie im Abschnitt [versions] der Versionskatalogdatei mit dem Namen libs.versions.toml (im Verzeichnis gradle in der Ansicht Projekt oder Gradle-Skripts in der Ansicht Android) einen Alias für die gewünschte Version der Abhängigkeit hinzu:

    [versions]
    agp = "8.3.0"
    androidx-macro-benchmark = "1.2.2"
    my-library = "1.4"
    
    [libraries]
    ...
    
    [plugins]
    ...
    

    Aliasse können Bindestriche oder Unterstriche enthalten. Diese Aliase generieren verschachtelte Werte, auf die Sie in Build-Skripts verweisen können. Die Verweise beginnen mit dem Namen des Katalogs, dem libs-Teil von libs.versions.toml. Wenn Sie einen Katalog mit einer einzelnen Version verwenden, empfehlen wir, den Standardwert „libs“ beizubehalten.

  2. Fügen Sie einen Alias für die Abhängigkeit in den Abschnitten [libraries] (für Remote-Binärdateien oder lokale Bibliotheksmodule) oder [plugins] (für Plug-ins) der Datei libs.versions.toml hinzu.

    [versions]
    ...
    
    [libraries]
    androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" }
    my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" }
    
    [plugins]
    androidApplication = { id = "com.android.application", version.ref = "agp" }
    

    Einige Bibliotheken sind in einer veröffentlichten Materialliste (BOM) verfügbar, in der Bibliotheksfamilien und ihre Versionen gruppiert sind. Sie können eine BOM in Ihren Versionskatalog und Ihre Build-Dateien aufnehmen und diese Versionen von ihr verwalten lassen. Weitere Informationen finden Sie unter Materialliste verwenden.

  3. Fügen Sie dem Build-Script der Module, die die Abhängigkeit benötigen, einen Verweis auf den Abhängigkeitsalias hinzu. Konvertieren Sie die Unterstriche und Bindestriche des Alias in Punkte, wenn Sie in einem Build-Skript darauf verweisen. Das Build-Script auf Modulebene würde so aussehen:

    Kotlin

    plugins {
      alias(libs.plugins.androidApplication)
    }
    
    dependencies {
      implementation(libs.androidx.benchmark.macro)
      implementation(libs.my.library)
    }

    Groovy

    plugins {
      alias 'libs.plugins.androidApplication'
    }
    
    dependencies {
      implementation libs.androidx.benchmark.macro
      implementation libs.my.library
    }

    Plug-in-Referenzen enthalten plugins nach dem Katalognamen und Versionsreferenzen enthalten versions nach dem Katalognamen. Versionsreferenzen sind selten. Beispiele für Versionsreferenzen finden Sie unter Abhängigkeiten mit denselben Versionsnummern. Bibliotheksreferenzen enthalten keinen libraries-Kennzeichner. Sie können also nicht versions oder plugins am Anfang eines Bibliotheks-Alias verwenden.

Abhängigkeiten konfigurieren

Im Block dependencies können Sie eine Bibliotheksabhängigkeit mit einer von mehreren verschiedenen Abhängigkeitskonfigurationen deklarieren (z. B. implementation, wie oben gezeigt). Jede Abhängigkeitskonfiguration liefert Gradle unterschiedliche Anweisungen zur Verwendung der Abhängigkeit. In der folgenden Tabelle werden die Konfigurationen beschrieben, die Sie für eine Abhängigkeit in Ihrem Android-Projekt verwenden können.

Konfiguration Verhalten
implementation Gradle fügt die Abhängigkeit dem Compile-Klassenpfad hinzu und verpackt die Abhängigkeit in der Build-Ausgabe. Wenn Ihr Modul eine implementation-Abhängigkeit konfiguriert, wird Gradle mitgeteilt, dass das Modul die Abhängigkeit zur Kompilierungszeit nicht an andere Module weitergeben soll. Das bedeutet, dass die Abhängigkeit nicht für andere Module verfügbar gemacht wird, die vom aktuellen Modul abhängen.

Wenn Sie diese Abhängigkeitskonfiguration anstelle von api verwenden, kann dies die Build-Zeit erheblich verkürzen, da die Anzahl der Module, die das Build-System neu kompilieren muss, reduziert wird. Wenn beispielsweise eine implementation-Abhängigkeit ihre API ändert, kompiliert Gradle nur diese Abhängigkeit und die Module, die direkt von ihr abhängen, neu. Die meisten App- und Testmodule sollten diese Konfiguration verwenden.

api Gradle fügt die Abhängigkeit dem Kompilierungs-Klassenpfad und der Build-Ausgabe hinzu. Wenn ein Modul eine api-Abhängigkeit enthält, wird Gradle darüber informiert, dass das Modul diese Abhängigkeit transitiv in andere Module exportieren möchte, damit sie sowohl zur Laufzeit als auch zur Kompilierzeit verfügbar ist.

Verwenden Sie diese Konfiguration mit Vorsicht und nur mit Abhängigkeiten, die Sie transitiv an andere Upstream-Nutzer exportieren müssen. Wenn eine api-Abhängigkeit ihre externe API ändert, kompiliert Gradle alle Module neu, die zur Kompilierzeit Zugriff auf diese Abhängigkeit haben. Eine große Anzahl von api-Abhängigkeiten kann die Build-Dauer erheblich verlängern. Sofern Sie die API einer Abhängigkeit nicht für ein separates Modul verfügbar machen möchten, sollten Bibliotheksmodule stattdessen implementation-Abhängigkeiten verwenden.

compileOnly Gradle fügt die Abhängigkeit nur dem Compile-Klassenpfad hinzu (d. h. sie wird nicht der Build-Ausgabe hinzugefügt). Das ist nützlich, wenn Sie ein Android-Modul erstellen und die Abhängigkeit während der Kompilierung benötigen, sie aber zur Laufzeit optional ist. Wenn Sie beispielsweise von einer Bibliothek abhängig sind, die nur Annotationen zur Kompilierzeit enthält, die normalerweise zum Generieren von Code verwendet werden, aber oft nicht in der Build-Ausgabe enthalten sind, können Sie diese Bibliothek als compileOnly markieren.

Wenn Sie diese Konfiguration verwenden, muss Ihr Bibliotheksmodul eine Laufzeitbedingung enthalten, um zu prüfen, ob die Abhängigkeit verfügbar ist. Anschließend muss es sein Verhalten so ändern, dass es auch dann funktioniert, wenn die Abhängigkeit nicht bereitgestellt wird. Dadurch wird die Größe der endgültigen App reduziert, da keine nicht kritischen vorübergehenden Abhängigkeiten hinzugefügt werden.

Hinweis: Sie können die compileOnly-Konfiguration nicht mit Android-Archiv-Abhängigkeiten (AAR) verwenden.

runtimeOnly Gradle fügt die Abhängigkeit nur der Build-Ausgabe hinzu, damit sie während der Laufzeit verwendet werden kann. Das heißt, sie wird nicht dem Compile-Klassenpfad hinzugefügt. Dies wird unter Android selten verwendet, ist aber in Serveranwendungen üblich, um Logging-Implementierungen bereitzustellen. Eine Bibliothek könnte beispielsweise eine Logging API verwenden, die keine Implementierung enthält. Nutzer dieser Bibliothek können sie als implementation-Abhängigkeit hinzufügen und eine runtimeOnly-Abhängigkeit für die tatsächliche Logging-Implementierung einfügen.
ksp
kapt
annotationProcessor

Diese Konfigurationen stellen Bibliotheken bereit, die Annotationen und andere Symbole in Ihrem Code verarbeiten, bevor er kompiliert wird. In der Regel wird Ihr Code validiert oder zusätzlicher Code generiert, sodass Sie weniger Code schreiben müssen.

Wenn Sie eine solche Abhängigkeit hinzufügen möchten, müssen Sie sie mit den Konfigurationen ksp, kapt oder annotationProcessor zum Klassenpfad des Annotationsprozessors hinzufügen. Durch diese Konfigurationen wird die Build-Leistung verbessert, da der Compile-Klassenpfad vom Klassenpfad des Annotationsprozessors getrennt wird. Wenn Gradle Annotationsprozessoren im Kompilierungs-Klassenpfad findet, wird die Kompilierungsvermeidung deaktiviert, was sich negativ auf die Build-Zeit auswirkt. Gradle 5.0 und höher ignorieren Annotationsprozessoren, die im Kompilierungs-Klassenpfad gefunden werden.

Das Android Gradle-Plug-in geht davon aus, dass eine Abhängigkeit ein Annotationsprozessor ist, wenn die JAR-Datei die folgende Datei enthält:

META-INF/services/javax.annotation.processing.Processor

Wenn das Plug-in einen Annotationsprozessor im Kompilierungs-Klassenpfad erkennt, wird ein Build-Fehler erzeugt.

ksp ist ein Kotlin Symbol Processor und wird vom Kotlin-Compiler ausgeführt.

kapt und apt sind separate Tools, die Annotationen verarbeiten, bevor Kotlin- oder Java-Compiler ausgeführt werden.

Berücksichtigen Sie bei der Entscheidung, welche Konfiguration Sie verwenden möchten, Folgendes:

  • Wenn ein Prozessor als Kotlin Symbol Processor verfügbar ist, verwenden Sie ihn als ksp-Abhängigkeit. Weitere Informationen zur Verwendung von Kotlin Symbol Processors finden Sie unter Von kapt zu ksp migrieren.
  • Wenn der Prozessor nicht als Kotlin Symbol Processor verfügbar ist:
    • Wenn Ihr Projekt Kotlin-Quellcode enthält (aber auch Java-Quellcode enthalten kann), verwenden Sie kapt, um ihn einzubinden.
    • Wenn Ihr Projekt nur Java-Quellen verwendet, binden Sie diese mit annotationProcessor ein.

Weitere Informationen zur Verwendung von Annotationsprozessoren finden Sie unter Annotationsprozessoren hinzufügen.

lintChecks

Verwenden Sie diese Konfiguration, um eine Bibliothek mit Lint-Prüfungen einzubinden, die Gradle beim Erstellen Ihres Android-App-Projekts ausführen soll.

Beachten Sie, dass AARs, die eine lint.jar-Datei enthalten, automatisch die in dieser lint.jar-Datei definierten Prüfungen ausführen. Sie müssen keine explizite lintChecks-Abhängigkeit hinzufügen. So kannst du Bibliotheken und zugehörige Lint-Prüfungen in einer einzigen Abhängigkeit definieren und dafür sorgen, dass deine Prüfungen ausgeführt werden, wenn Nutzer deine Bibliothek verwenden.

lintPublish Verwenden Sie diese Konfiguration in Android-Bibliotheksprojekten, um Lint-Prüfungen einzuschließen, die Gradle in eine lint.jar-Datei kompilieren und in Ihr AAR-Paket aufnehmen soll. Dadurch werden diese Lint-Prüfungen auch auf Projekte angewendet, die Ihre AAR-Datei verwenden. Wenn Sie zuvor die Abhängigkeitskonfiguration lintChecks verwendet haben, um Lint-Prüfungen in das veröffentlichte AAR einzubinden, müssen Sie diese Abhängigkeiten migrieren, um stattdessen die Konfiguration lintPublish zu verwenden.

Kotlin

dependencies {
  // Executes lint checks from the ":checks" project at build time.
  lintChecks(project(":checks"))
  // Compiles lint checks from the ":checks-to-publish" into a
  // lint.jar file and publishes it to your Android library.
  lintPublish(project(":checks-to-publish"))
}

Groovy

dependencies {
  // Executes lint checks from the ':checks' project at build time.
  lintChecks project(':checks')
  // Compiles lint checks from the ':checks-to-publish' into a
  // lint.jar file and publishes it to your Android library.
  lintPublish project(':checks-to-publish')
}

Abhängigkeiten für eine bestimmte Build-Variante konfigurieren

Bei allen oben genannten Konfigurationen werden Abhängigkeiten auf alle Build-Varianten angewendet. Wenn Sie stattdessen eine Abhängigkeit nur für ein bestimmtes Source-Set einer Build-Variante oder für ein Test-Source-Set deklarieren möchten, müssen Sie den Konfigurationsnamen großschreiben und ihm den Namen der Build-Variante oder des Test-Source-Sets voranstellen.

Wenn Sie beispielsweise eine Remote-Binärabhängigkeit nur mit der implementation-Konfiguration zu Ihrer „kostenlosen“ Produktvariante hinzufügen möchten, verwenden Sie Folgendes:

Kotlin

dependencies {
    freeImplementation("com.google.firebase:firebase-ads:21.5.1")
}

Groovy

dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:21.5.1'
}

Wenn Sie jedoch eine Abhängigkeit für eine Variante hinzufügen möchten, die eine Produktvariante und einen Build-Typ kombiniert, müssen Sie den Konfigurationsnamen initialisieren:

Kotlin

// Initializes a placeholder for the freeDebugImplementation dependency configuration.
val freeDebugImplementation by configurations.creating

dependencies {
    freeDebugImplementation(project(":free-support"))
}

Groovy

configurations {
    // Initializes a placeholder for the freeDebugImplementation dependency configuration.
    freeDebugImplementation {}
}

dependencies {
    freeDebugImplementation project(":free-support")
}

So fügen Sie implementation-Abhängigkeiten für Ihre lokalen Tests und Instrumentierungstests hinzu:

Kotlin

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation("junit:junit:4.12")

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}

Groovy

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

Bestimmte Konfigurationen sind in dieser Situation jedoch nicht sinnvoll. Da andere Module nicht von androidTest abhängen können, erhalten Sie beispielsweise die folgende Warnung, wenn Sie die androidTestApi-Konfiguration verwenden:

WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with
'androidTestImplementation'.

Abhängigkeitsreihenfolge

Die Reihenfolge, in der Sie Ihre Abhängigkeiten auflisten, gibt die Priorität für jede Abhängigkeit an. Beispielsweise hat die erste Bibliothek eine höhere Priorität als die zweite und die zweite eine höhere Priorität als die dritte. Diese Reihenfolge ist wichtig, wenn Ressourcen zusammengeführt oder Manifestelemente aus den Bibliotheken in Ihre App zusammengeführt werden.

Wenn Ihr Projekt beispielsweise Folgendes deklariert:

  • Abhängigkeit von LIB_A und LIB_B (in dieser Reihenfolge)
  • Und LIB_A hängt von LIB_C und LIB_D ab (in dieser Reihenfolge)
  • Und LIB_B ist auch von LIB_C abhängig.

Die flache Abhängigkeitsreihenfolge sieht dann so aus:

  1. LIB_A
  2. LIB_D
  3. LIB_B
  4. LIB_C

So wird sichergestellt, dass sowohl LIB_A als auch LIB_B LIB_C überschreiben können und LIB_D immer noch eine höhere Priorität als LIB_B hat, da LIB_A (das davon abhängt) eine höhere Priorität als LIB_B hat.

Weitere Informationen zum Zusammenführen von Manifesten aus verschiedenen Projektquellen oder Abhängigkeiten finden Sie unter Mehrere Manifestdateien zusammenführen.

Abhängigkeitsinformationen für die Play Console

Beim Erstellen Ihrer App fügt das AGP Metadaten hinzu, die die Bibliotheksabhängigkeiten beschreiben, die in Ihre App kompiliert werden. Wenn Sie Ihre App hochladen, prüft die Play Console diese Metadaten, um Sie auf bekannte Probleme mit SDKs und Abhängigkeiten hinzuweisen, die Ihre App verwendet. In einigen Fällen erhalten Sie auch umsetzbares Feedback, um diese Probleme zu beheben.

Die Daten werden komprimiert, mit einem Google Play-Signaturschlüssel verschlüsselt und im Signaturblock der Release-App gespeichert. Wir empfehlen, diese Abhängigkeitsdatei beizubehalten, um eine sichere und positive Nutzererfahrung zu gewährleisten. Sie können diese Option deaktivieren, indem Sie den folgenden dependenciesInfo-Block in die build.gradle.kts-Datei Ihres Moduls einfügen.

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

Weitere Informationen zu unseren Richtlinien und potenziellen Problemen mit Abhängigkeiten finden Sie auf unserer Supportseite zur Verwendung von Drittanbieter-SDKs in Ihrer App.

SDK-Statistiken

Android Studio zeigt Lint-Warnungen in der Versionskatalogdatei und im Dialogfeld „Projektstruktur“ für öffentliche SDKs im Google Play SDK Index an, wenn die folgenden Probleme auftreten:

  • Die SDKs wurden von ihren Autoren als veraltet markiert.
  • Die SDKs verstoßen gegen die Google Play-Richtlinien.
  • Die SDKs weisen bekannte Sicherheitslücken auf.
  • Die SDKs wurden von ihren Entwicklern eingestellt.

Die Warnungen sind ein Hinweis darauf, dass du diese Abhängigkeiten aktualisieren solltest, da du sonst in Zukunft möglicherweise keine Apps mehr in der Google Play Console veröffentlichen kannst.

Build-Abhängigkeiten ohne Versionskataloge hinzufügen

Wir empfehlen, Versionskataloge zum Hinzufügen und Verwalten von Abhängigkeiten zu verwenden. Bei einfachen Projekten sind sie jedoch möglicherweise nicht erforderlich. Hier ist ein Beispiel für eine Build-Datei, in der keine Versionskataloge verwendet werden:

Kotlin

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

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation("com.example.android:app-magic:12.3")
    // Dependency on a local library module
    implementation(project(":mylibrary"))
}

Groovy

plugins {
    id 'com.android.application'
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
    // Dependency on a local library module
    implementation project(':mylibrary')
}

In dieser Build-Datei wird eine Abhängigkeit von Version 12.3 der Bibliothek „app-magic“ innerhalb der Namespace-Gruppe „com.example.android“ deklariert. Die Deklaration der Remote-Binärabhängigkeit ist eine Kurzform für Folgendes:

Kotlin

implementation(group = "com.example.android", name = "app-magic", version = "12.3")

Groovy

implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

In der Build-Datei wird auch eine Abhängigkeit von einem Android-Bibliotheksmodul namens „mylibrary“ deklariert. Dieser Name muss mit dem Bibliotheksnamen übereinstimmen, der in Ihrer settings.gradle.kts-Datei mit einem include: definiert ist. Wenn Sie Ihre App erstellen, kompiliert das Build-System das Bibliotheksmodul und verpackt die resultierenden kompilierten Inhalte in der App.

In der Build-Datei wird auch eine Abhängigkeit vom Android Gradle-Plug-in (com.application.android) deklariert. Wenn Sie mehrere Module haben, die dasselbe Plug-in verwenden, können Sie nur eine einzige Version des Plug-ins im Build-Klassenpfad für alle Module haben. Anstatt die Version in jedem Build-Skript des Moduls anzugeben, sollten Sie die Plug-in-Abhängigkeit im Stamm-Build-Skript mit der Version einfügen und angeben, dass sie nicht angewendet werden soll. Durch das Hinzufügen von apply false wird Gradle angewiesen, die Version des Plug-ins zu notieren, es aber nicht im Stamm-Build zu verwenden. In der Regel ist das Stamm-Build-Script bis auf diesen plugins-Block leer.

Kotlin

plugins {
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02' apply false
}

Wenn Sie ein Projekt mit nur einem Modul haben, können Sie die Version explizit im Build-Script auf Modulebene angeben und das Build-Script auf Projektebene leer lassen:

Kotlin

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

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02'
}