AndroidStudio统⼀依赖管理Composingbuilds
Android Studio统⼀依赖管理
背景
在我们的AS项⽬中,经常引⽤多个Module,多⼈参与项⽬开发,这种背景下,我们会时常遇到版本冲突问题,出现不同的compileSdkVersion等,导致我们的包体变⼤,项⽬运⾏时间变长,所以将依赖版本统⼀是⼀个项⽬优化的必经之路。
你可能遇到这样的问题
在架构设计阶段,你的依赖库是这样的
同事并⾏开发后,合并代码后,变成了这样
哈哈哈,这就是没做好依赖管理的后果!下⾯介绍三种依赖管理⽅式。如果对前两种已经很熟悉了,可以直接跳转看第三种Composing builds,推荐使⽤第三种。
⼀、Groovy ext扩展函数的替代⽅式
我们在使⽤Groovy语⾔构建项⽬的时候,抽取adle作为全局的变量控制,使⽤ext扩展函数来统⼀配置依赖,如下:
⽰例代码:
ext {
android = [
compileSdkVersion: 29,
buildToolsVersion: "29",
minSdkVersion    : 17,
targetSdkVersion : 26,
versionCode      : 102,
versionName      : "1.0.2"
]
version = [
appcompatVersion      : "1.1.0",
coreKtxVersion        : "1.2.0",
supportLibraryVersion  : "28.0.0",
androidTestVersion    : "3.0.1",
android retrofit
junitVersion          : "4.12",
glideVersion          : "4.11.0",
okhttpVersion          : "3.11.0",
retrofitVersion        : "2.3.0",
constraintLayoutVersion: "1.1.3",
gsonVersion            : "2.7",
rxjavaVersion          : "2.2.2",
rxandroidVersion      : "2.1.0",
..........省略...........
]
dependencies = [
/
/base
"constraintLayout"      : "straintlayout:constraintlayout:${version["constraintLayoutVersion"]}",            "appcompat"            : "androidx.appcompat:appcompat:${version["appcompatVersion"]}",
"coreKtx"              : ":core-ktx:${version["coreKtxVersion"]}",
"material"              : "le.android.material:material:1.2.1",
//multidex
"multidex"              : "com.android.support:multidex:${version["multidexVersion"]}",
//okhttp
"okhttp"                : "com.squareup.okhttp3:okhttp:${version["okhttpVersion"]}",
"logging-interceptor"  : "com.squareup.okhttp3:logging-interceptor:${version["okhttpVersion"]}",
//retrofit
"retrofit"              : "fit2:retrofit:${version["retrofitVersion"]}",
"converter-gson"        : "fit2:converter-gson:${version["retrofitVersion"]}",
"adapter-rxjava2"      : "fit2:adapter-rxjava2:${version["retrofitVersion"]}",
"converter-scalars"    : "fit2:converter-scalars:${version["retrofitVersion"]}",
..........省略...........
]
}
依赖写完之后,在root路径下的adle
添加apply from: "adle"
然后在需要依赖的module下的adle中
...
// Retrofit + okhttp 相关的依赖包
dependencies["retrofit"]
...
}
以上就是Groovy ext扩展函数的依赖管理⽅式,此⽅式可以做到版本依赖,但是最⼤的缺点就是⽆法跟踪代码,想要到上⾯⽰例代码中的dependencies["retrofit"]这个依赖,需要⼿动切到adle去搜索查,可读性很差。
⼆、使⽤buildSrc+kotlin的⽅式
buildSrc的⽅式,是最近⼏年特别流⾏的版本依赖管理⽅式。它有以下⼏个优点:
⽀持双向跟踪
buildSrc是Android默认插件,全局只有这⼀个地⽅可以修改
⽀持Android Studio的代码补全,以下演⽰⽰例图来⾃于⽹络
使⽤⽅式可参考:
缺点:buildSrc 依赖更新将重新构建整个项⽬,项⽬越⼤,重新构建的时间就越长,造成不必要的时间浪费。
三、Composing builds
:A composite build is simply a build that includes other builds. In many ways a composite build is similar to a Gradle multi-project build, except that instead of including single projects, complete builds are included.(Composing builds只是包含其他构建的构建。 在许多⽅⾯,复合构建类似于Gradle多项⽬构建,不同之处在于,它包括完整的构建,⽽不是包括单个项⽬。)
使⽤这种⽅式的优点有:
1.⽀持单向跟踪
2.⾃动补全
3.依赖更新时,不会重新构建整个项⽬
使⽤⽅式
1.新建module,名为VersionPlugin(⾃起)
2.在新建的module下的adle⽂件中,添加如下代码:
repositories {
jcenter()
}
dependencies {
// 因为使⽤的 Kotlin 需要需要添加 Kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10"
}
}
apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
repositories {
// 需要添加 jcenter 否则会提⽰不到 gradlePlugin
jcenter()
google()
}
dependencies {
implementation gradleApi()
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10"
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
gradlePlugin {
plugins {
version {
// 在 app 模块需要通过 id 引⽤这个插件
id = 'ler.versionplugin'
// 实现这个插件的类的路径
implementationClass = 'ler.versionplugin.VersionPlugin'
}
}
}
3.在 VersionPlugin/src/main/java/包名/ ⽬录下新建 DependencyManager.kt ⽂件,添加你的依赖配置,如:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。