Wie teile ich Abhängigkeiten zwischen Android-Modulen?
Lesezeit: 6 Minuten
Andreas
Ich habe ein Android-Anwendungsmodul (App) und ein Android-Bibliotheksmodul (Bibliothek). Sowohl die App als auch die Bibliothek enthalten dieselben Abhängigkeiten:
Wenn ich jedoch versuche, diesen Block zum hinzuzufügen Projekt build.gradle, es beschwert sich darüber, dass es die “compile” DSL nicht kennt.
BEARBEITEN: Ich frage nach dem Einfügen dieses Abhängigkeitsblocks in das PROJECT build.gradle, um zu vermeiden, dass es in build.gradle jedes Moduls wiederholt wird.
Mögliches Duplikat von Android – Gradle Multiproject Include- und Exclude-Bibliotheken
– Jared Burrows
5. August 2015 um 20:21 Uhr
Nein, ich frage nach dem Teilen von Abhängigkeiten zwischen Modulen, um zu vermeiden, dass sie in jedem Modul wiederholt werden müssen.
– Andreas
5. August 2015 um 20:38 Uhr
Jules
Ab Gradle-Plug-in-Version 3.0.0 Es gibt einen schöneren Weg, dies zu tun. Wir können steuern, ob jede Abhängigkeit nur für das aktuelle Modul oder für das aktuelle Modul UND alle davon abhängigen Module verfügbar ist. Dies ermöglicht es uns, Abhängigkeiten zwischen Modulen innerhalb eines Projekts einfach zu teilen.
So haben wir früher Abhängigkeiten deklariert:
kompilieren ‘Beispiel.Abhängigkeit:1.0.0’
Hier sind die neuen Konfigurationen, die das Kompilieren ersetzen sollten:
Implementierung ‘example.dependency:1.0.0’ –> diese Abhängigkeit wird nur innerhalb dieses Moduls verwendet
API ‘example.dependency:1.0.0’ –> diese Abhängigkeit wird auch in allen Builds verfügbar sein, die von diesem Modul abhängen
So machen Sie das mit der Architektur, die Sie in der Frage erwähnt haben. Angenommen, wir haben ein Modul mit dem Namen ‘Bibliothek’ das wird von der verbraucht ‘app’ Modul können wir das verwenden API -Konfiguration, um zu deklarieren, dass die Abhängigkeit mit jedem Modul geteilt werden soll, das davon abhängt.
Bibliotheksmodul build.gradle
dependencies {
// dependencies marked 'implementation' will only be available to the current module
implementation 'com.squareup.okhttp:okhttp:2.4.0'
// any dependencies marked 'api' will also be available to app module
api 'com.squareup.retrofit:retrofit:1.9.0'
api 'io.reactivex:rxjava:1.0.13'
api 'io.reactivex:rxandroid:0.25.0'
}
App-Modul build.gradle:
dependencies {
// declare dependency on library module
implementation project(':library')
// only need to declare dependencies unique to app
implementation 'example.dependency:1.0.0'
}
Bitte sehen diese Anleitung für weitere Informationen und Diagramme.
Konnte es nicht zum Laufen bringen. Habe genau das gleiche gemacht und ich benutze auch Retrofit in der Bibliothek, aber immer noch. Wenn ich mein Bibliotheksmodul als .aar importiere, stürzt es nach erfolgreicher Kompilierung auf dem Gerät mit der Ausnahme classnotfound ab. Irgendwelche Tipps?
– Burak-Tag
21. März 2018 um 10:53 Uhr
Hallo @Jules … könnten Sie bitte meine Frage beantworten stackoverflow.com/questions/51694352/…
– Abdulmalek Dery
6. August 2018 um 9:54 Uhr
Was ist mit Kapt?
– Mein K
22. November 2019 um 0:22 Uhr
Der Abhängigkeitsblock (Closure) benötigt DependencyHandler als Delegate
Sie müssen den DependencyHandler jedes Projekts an gemeinsam genutzte Abhängigkeiten übergeben Projekt gradle.build.
(Siehe 2. Verwenden der Standardabhängigkeitsgruppe. Dieses Beispiel erläutert viele weitere Tipps zum Teilen von Bibliotheksversionen, SDK-Versionen … für große Projekte mit vielen Modulen.)
Sie können gemeinsam genutzte Gradle-Abhängigkeiten im Bibliotheksmodul definieren, und wenn das App-Modul die Bibliothek als Abhängigkeit hat, müssen Sie nicht alles zweimal angeben. Wenn Sie dies weiterführen, könnten Sie ein “gemeinsames” Modul erstellen, das die gemeinsamen Gradle-Abhängigkeiten erfordert, und sowohl das App- als auch das Bibliotheksmodul das gemeinsame Modul erfordern.
Sie könnten so etwas tun, wo die Projekt build.gradle gibt die benötigten Abhängigkeiten als Variablennamen dann in der an App build.gradle-Dateien müssen Sie nur die Variablennamen einfügen. Dies ist sehr nützlich, wenn Sie viele Module haben und nicht alle bearbeiten möchten, wenn sich eine Versionsnummer ändert!
Basierend auf der @SMKS-Antwort würde ich diese Lösung aus Gründen der transitiven Optionsfähigkeit und Einfachheit bevorzugen
Projekt build.gradle
buildscript {
... (the rest of your repositories/dependency info here) ...
}
ext {
googlePlayServicesVersion = '7.5.0'
supportLibVersion = '22.2.0'
}
app build.gradle-Datei
dependencies {
compile 'com.android.support:support-v4:' + supportLibVersion
compile ' com.android.support:support-annotations:' + supportLibVersion
compile="com.android.support:recyclerview-v7:" + supportLibVersion {
transitive = true // do not know if this make sens/interest just for example
}
...
}
13947400cookie-checkWie teile ich Abhängigkeiten zwischen Android-Modulen?yes
Mögliches Duplikat von Android – Gradle Multiproject Include- und Exclude-Bibliotheken
– Jared Burrows
5. August 2015 um 20:21 Uhr
Nein, ich frage nach dem Teilen von Abhängigkeiten zwischen Modulen, um zu vermeiden, dass sie in jedem Modul wiederholt werden müssen.
– Andreas
5. August 2015 um 20:38 Uhr