为了充分利用Android Plugin for Gradle 3.0+
的长处,将Android我的项目拆分成多个module的做法越来越常见。然而,随着module数量的增多,咱们很快就会遇到依赖治理的凌乱问题。
治理Gradle依赖的三种不同办法:
- 手动治理
- 应用Google举荐的
“ext”
Kotlin + buildSrc
1、手动治理
这是一种大多数人在采纳的治理依赖的办法,但每次降级依赖库时都须要做大量的手动更改。
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_annotationsimplementation libs.support_appcompat_v7implementation libs.retrofitimplementation libs.retrofit_rxjava_adapterimplementation libs.rxjava
module_b/build.gradle
implementation libs.support_annotationsimplementation libs.support_appcompat_v7implementation libs.retrofitimplementation libs.retrofit_rxjava_adapterimplementation libs.rxjava
这种办法是手动治理的一大提高,然而短少IDE的反对,更精确的说是在更新依赖库的时候IDE不能主动补全。
Kotlin + buildSrc == 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_annotationsimplementation Libs.support_appcompat_v7implementation Libs.retrofitimplementation Libs.retrofit_rxjava_adapterimplementation Libs.rxjava
module_a/build.gradle
implementation Libs.support_annotationsimplementation Libs.support_appcompat_v7implementation Libs.retrofitimplementation Libs.retrofit_rxjava_adapterimplementation 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。
Android高级开发零碎进阶笔记、最新面试温习笔记PDF,我的GitHub
文末
您的点赞珍藏就是对我最大的激励!
欢送关注我,分享Android干货,交换Android技术。
对文章有何见解,或者有何技术问题,欢送在评论区一起留言探讨!