文章图片
为了充分利用Android Plugin for Gradle 3.0+
的优点,将Android项目拆分成多个module的做法越来越常见。然而,随着module数量的增多,我们很快就会遇到依赖管理的混乱问题。
管理Gradle依赖的三种不同方法:
- 手动管理
- 使用Google推荐的
“ext”
Kotlin + buildSrc
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"
这里存在许多重复的配置,而且当你的项目有很多module时很难管理依赖库的版本更新。
Google推荐:使用gradle的extra属性 Google在Android官方文档中推荐这种管理依赖的方法。许多项目例如
ButterKnife
、Picasso
等都在使用这种方法。此方法非常适用于更新
support library
的版本,因为每个support library
都具有相同的版本号,你只需要在一个地方更改它就行了。Retrofit等其它第三方库也是如此。Root-level build.gradle
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
这种方法是手动管理的一大进步,但是缺少IDE的支持,更准确的说是在更新依赖库的时候IDE不能自动补全。
Kotlin + buildSrc =https://www.it610.com/article/= Android Studio Autocomplete
文章图片
您需要在您的项目里创建一个
buildSrc
模块,然后编写kotlin代码来管理依赖库,使得IDE支持自动补全。Gradle文档中有这样一段话:
当你运行Gradle时,它会检查项目中是否存在一个名为buildSrc的目录。然后Gradle会自动编译并测试这段代码,并将其放入构建脚本的类路径中。您不需要提供任何进一步的操作提示。你只需要在buildSrc module中新建两个文件:
build.gradle.kts
- 编写Kotlin代码的文件 (本文中是指
Dependencies.kt
)
文章图片
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}"
}
经过上面两个步骤后,执行一次
Gradle Sync
任务,现在我们可以在Android Studio中访问Dependencies.kt
中任何值了。看起来结果与“ext”非常相似,但是它支持自动补全和单击跳转。
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_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava
结束语 我强烈推荐您使用
“Kotlin + buildSrc”
的方法。它支持自动补全和单击跳转,使得您无需在文件之间手动来回切换,方便你更好的管理Gradle依赖。动手实践: 新建的module名称必须为
buildSrc
一开始我按照作者原文的描述,在Android Studio里右键单击项目,New 出一个名为buildSrc
的Android Library
,试了好几遍都提示“Gradle sync failed: Plugin with id 'com.android.library' not found”
的错误。后来我参考这里的做法,手动创建了
buildSrc
这个模块。步骤如下:- 1、在项目根目录下新建一个名为
buildSrc
的文件夹(与项目里的app文件夹同级)。 - 2、在
buildSrc
文件夹里创建名为build.gradle.kts
的文件,文件内容参考之前的描述。 - 3、在buildSrc文件夹里创建
src/main/java
文件夹,如下图所示。并在该文件夹下创建Dependencies.kt
文件,文件内容参考之前的描述。
文章图片
- build一遍你的项目,然后重启你的Android Studio,项目里就会多出一个名为
buildSr
c的module。
文章图片
文末 【Kotlin + buildSrc(更好的管理Gadle依赖!)】您的点赞收藏就是对我最大的鼓励!
欢迎关注我,分享Android干货,交流Android技术。
对文章有何见解,或者有何技术问题,欢迎在评论区一起留言讨论!
推荐阅读
- 字节跳动、今日头条、阿里爸爸都在使用Flutter,你还有拒绝的理由()
- 四步,搞定一个短信验证码登录!
- 自定义view仿写今日头条点赞动画!
- Jetpack Compose有学的必要吗(未来前景将会怎样?)
- 字节内部Android笔记泄露,2960页完整版限时下载!!
- Android自定义支付密码输入框,光标问题总结!
- 如何评价性能优化(涵盖知识面太广?)
- Retrofit 妙用,拒绝重复代码!
- 启动优化 - 有向无环图