DEV Community

Ali sami hakemy
Ali sami hakemy

Posted on

Gradle Dependency Management

Multi-module Android projects are now the recommended way to take advantages of performance improvements with Android Gradle Plugin 3+. However, as we add more modules to our project, we quickly run into the issue of dependency management.

Different ways of managing Gradle dependencies:

  • Manual Management
  • Google’s Recommendation using “ext”
  • Kotlin + buildSrc

Manual managment

This is the way most of us have been managing dependencies, but it requires a lot of manual changes whenever you upgrade a library to ensure that versions are updated correctly.

module_a/build.gradle

implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"

module_b/build.gradle

implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"

Google’s Recommendation: Using Gradle Extra Properties

ext {
versions = [
support_lib: "27.0.2",
retrofit: "2.3.0",
rxjava: "2.1.9"
]
libs = [
support_annotations: "com.android.support:support-annotations:${versions.support_lib}",
support_appcompat_v7: "com.android.support:appcompat-v7:${versions.support_lib}",
retrofit :"com.squareup.retrofit2:retrofit:${versions.retrofit}",
retrofit_rxjava_adapter: "com.squareup.retrofit2:adapter-rxjava2:${versions.retrofit}",
rxjava: "io.reactivex.rxjava2:rxjava:${versions.rxjava}"
]
}

module_a/build.gradle

implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava

module_b/build.gradle

implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava

Kotlin + buildSrc

You just need 2 files in your buildSrc module:

  • build.gradle.kts
  • Kotlin Code (In this case,Dependencies.kt)

Image description

buildSrc/build.gradle.kts

plugins {
kotlin-dsl
}

buildSrc/src/main/java/Dependencies.kt

`object Versions {
val support_lib = "27.0.2"
val retrofit = "2.3.0"
val rxjava = "2.1.9"
}

object Libs {
val support_annotations = "com.android.support:support-annotations:${Versions.support_lib}"
val support_appcompat_v7 = "com.android.support:appcompat-v7:${Versions.support_lib}"
val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
val retrofit_rxjava_adapter = "com.squareup.retrofit2:adapter-rxjava2:${Versions.retrofit}"
val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}"
}`

After we have done a Gradle Sync, following making the changes above, we can now access any of the values in Android Studio.

module_a/build.gradle

implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava

module_b/build.gradle

implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava

Top comments (0)