为了充分利用Android Plugin for Gradle 3.0+的优点,将Android项目拆分成多个module的做法越来越常见。然而,随着module数量的增多,我们很快就会遇到依赖管理的混乱问题。
这是一种大多数人在采用的管理依赖的方法,但每次升级依赖库时都需要做大量的手动更改。
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"
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时很难管理依赖库的版本更新。
Google在Android官方文档中推荐这种管理依赖的方法。许多项目例如ButterKnife、Picasso等都在使用这种方法。
此方法非常适用于更新support library的版本,因为每个support library都具有相同的版本号,你只需要在一个地方更改它就行了。 Retrofit等其它第三方库也是如此。
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}" ] }
implementation libs.support_annotations implementation libs.support_appcompat_v7 implementation libs.retrofit implementation libs.retrofit_rxjava_adapter implementation libs.rxjava
implementation libs.support_annotations implementation libs.support_appcompat_v7 implementation libs.retrofit implementation libs.retrofit_rxjava_adapter implementation libs.rxjava
这种方法是手动管理的一大进步,但是缺少IDE的支持,更准确的说是在更新依赖库的时候IDE不能自动补全。
您需要在您的项目里创建一个 buildSrc 模块,然后编写 kotlin 代码来管理依赖库,使得IDE支持自动补全。
当你运行Gradle时,它会检查项目中是否存在一个名为 buildSrc
的目录。然后Gradle会自动编译并测试这段代码,并将其放入构建脚本的类路径中。您不需要提供任何进一步的操作提示。
Dependencies.kt
plugins { `kotlin-dsl` }
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}" }
经过上面两个步骤后,执行一次Gradle Sync任务,现在我们可以在Android Studio中访问Dependencies.kt中任何值了。
看起来结果与“ext”非常相似,但是它支持自动补全和单击跳转。
implementation Libs.support_annotations implementation Libs.support_appcompat_v7 implementation Libs.retrofit implementation Libs.retrofit_rxjava_adapter implementation Libs.rxjava
implementation Libs.support_annotations implementation Libs.support_appcompat_v7 implementation Libs.retrofit implementation Libs.retrofit_rxjava_adapter implementation Libs.rxjava
我强烈推荐您使用“Kotlin + buildSrc”的方法。它支持自动补全和单击跳转,使得您无需在文件之间手动来回切换,方便你更好的管理Gradle依赖。