Wie teile ich Abhängigkeiten zwischen Android-Modulen?

Lesezeit: 6 Minuten

Benutzeravatar von Andrew
Andreas

Ich habe ein Android-Anwendungsmodul (App) und ein Android-Bibliotheksmodul (Bibliothek). Sowohl die App als auch die Bibliothek enthalten dieselben Abhängigkeiten:

dependencies {
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'io.reactivex:rxjava:1.0.13'
    compile 'io.reactivex:rxandroid:0.25.0'
}

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

Benutzeravatar von Jules
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.

Projekt build.gradle

ext.sharedGroup = {dependencyHandler->
    delegate = dependencyHandler

    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'io.reactivex:rxjava:1.0.13'
    compile 'io.reactivex:rxandroid:0.25.0'
}

App build.gradle

dependencies {
    sharedGroup dependencies
}

Ref. https://github.com/b1uec0in/DependencyVersionResolver

(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!

Projekt build.gradle

buildscript {
    ext {
        googlePlayServicesVersion = '7.5.0'
        supportLibVersion = '22.2.0'
    }
... (the rest of your repositories/dependency info here) ...
}

ext {
    minSdkVersion=16
    targetSdkVersion=21
    buildToolsVersion='22.0.1'
    compileSdkVersion=21

    //Android Dependencies
    supportV4 = 'com.android.support:support-v4:' + supportLibVersion
    supportAnnotations="com.android.support:support-annotations:" + supportLibVersion
    recyclerView = 'com.android.support:recyclerview-v7:' + supportLibVersion
    cardView = 'com.android.support:cardview-v7:' + supportLibVersion
    palette="com.android.support:palette-v7:" + supportLibVersion
    appCompat="com.android.support:appcompat-v7:" + supportLibVersion
    multidex = 'com.android.support:multidex:1.0.1'
    appCompat="com.android.support:appcompat-v7:" + supportLibVersion
    supportDesign = 'com.android.support:design:' + supportLibVersion
    playServicesAnalytics="com.google.android.gms:play-services-analytics:" + googlePlayServicesVersion
}

App build.gradle-Datei

dependencies {
   compile rootProject.ext.supportV4
    compile rootProject.ext.appCompat
    compile rootProject.ext.supportAnnotations
    compile rootProject.ext.recyclerView
    compile rootProject.ext.cardView
    compile rootProject.ext.palette
    compile rootProject.ext.appCompat
    compile rootProject.ext.multidex
    compile rootProject.ext.supportDesign
    compile rootProject.ext.playServicesAnalytics

}

Hoffe das hilft!

Teilen Sie Bibliotheken mit dem ext-Block im Root-Projektmodul

Dies ist eine einfache Möglichkeit, die Bibliothek über alle Module im Android-Projekt hinweg zu verwenden

Bitte folgen Sie diesen Schritten:

  1. Fügen Sie den Ext-Block (er wird verwendet, um zusätzliche Eigenschaften für das Projekt zu definieren) in der Gradle-Datei des Stammprojekts hinzu
  2. Fügen Sie allgemeine Bibliotheken mit dem Variablennamen im Ext-Block hinzu, z. B. Name = [
    libraries without implementation keyword
    ]
  3. Verwendet diesen Ext-Block auf Modulebene unter Verwendung von Implementierung und Variablennamen, z. B. Implementierung variable_name

Siehe unten Code für die vollständige Implementierung

build.gradle: Projekt

buildscript {
... (the rest of your repositories here) ...
}

ext { **// ext block start here**




appModuleLibraries = [
            commonLibraries,
            /*Projects*/
            project(':hco-cutout'),
            project(':utils')

    ]

commonLibraries = [
        /*Android Libs*/
        'androidx.core:core-ktx:1.7.0',
        'androidx.appcompat:appcompat:1.4.1',
        'com.google.android.material:material:1.5.0',
        'androidx.constraintlayout:constraintlayout:2.1.3',
        /*Gesture viw for image zooming */
        'com.alexvasilkov:gesture-views:2.5.2',


]
cutoutModulleLibraries = [
        commonLibraries,
        project(':utils'),
        // Selfie segmentation
        'com.google.mlkit:segmentation-selfie:16.0.0-beta4',

        /*checker board drawable*/
        'com.github.duanhong169:checkerboarddrawable:1.0.2',
]
} **// ext block end here**

build.gradle :app

      dependencies {
    
      /*App Module Libraries in root project gradle*/

        implementation appModuleLibraries
    }

build.gradle: Ausschnitt

 dependencies {
    /*cutout Module Libraries in root project gradle*/

    implementation cutoutModulleLibraries

    implementation project(':utils')

}

Hoffe das hilft!

Benutzeravatar von Anthony
Antonius

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

1394740cookie-checkWie teile ich Abhängigkeiten zwischen Android-Modulen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy