本篇只是作记录。
-
简述
每个项目从新建开始我们或多或少都会导入各种依赖库,如果项目中只有一个module的话,对于依赖库版本的管理很容易,但是多个module的话,稍加不注意,很容易导入多个版本的库甚至产生版本冲突,更新修改依赖库也需要多处操作,所以我们需要对依赖库版本进行统一管理。(就简单说一下,其实大家都理解)
-
实现方案
实现依赖库版本的统一管理现在流行的方案大致有三种(有更好的方案,大家可以推荐下):
-
ext(Google推荐)
-
Kotlin + buildSrc
-
Gradle Composite builds
-
ext
这个方案就不多说啊,很简单,就根目录下的build.gradle文件中中添加一个包含版本号的"ext{}",在module的导入包时,使用"$rootProject.对应依赖版本"的方式实现。当然也可把ext{}写在另一个.gradle中导入build.gradle,ext{}中也可对版本进行分组
//config.gradle
ext{
libVersions=[
arouterApiVersion :'1.5.0',
arouterCompilerVersion :'1.2.2'
]
}
//根目录下的build.gradle
apply from:'config.gradle'
ext {
arouterCompilerVersion = '1.2.2'
}
//module中的build.gradle
dependenices{
api "com.alibaba:arouter-api:$libVersions.arouterApiVersion"
annotationProcessor "com.alibaba:arouter-compiler:$rootProject.arouterCompilerVersion"
}
-
buildSrc
- 在根目录下创建一个目录buildSrc(名称必须是buildSrc,下面有解释)
-
buildSrc目录中创建build.gradle.kts文件
plugins { `kotlin-dsl` } repositories { mavenCentral() jcenter() google() }
- 创建kt文件,包含依赖包和版本号。我这里创建了两个文件
//Dependencies.kt object Versions { val vAppCompat = "1.2.0" } object OtherLibs { val appcompat = "androidx.appcompat:appcompat:${Versions.vAppCompat}" } //AndroidConfig.kt object AndroidConfig { val compileSdkVersion = 30 val buildToolsVersion = "29.0.3" val defaultConfig = DefaultConfig() class DefaultConfig { val applicationId = "com.lsy.myapplication" val minSdkVersion = 21 val targetSdkVersion = 30 val versionCode = 1 val versionName = "1.0" } }
- 创建完成后sync项目,然后就可以在module中的build.gradle中直接使用了
android { compileSdkVersion AndroidConfig.compileSdkVersion buildToolsVersion AndroidConfig.buildToolsVersion defaultConfig { applicationId AndroidConfig.defaultConfig.applicationId minSdkVersion AndroidConfig.defaultConfig.minSdkVersion targetSdkVersion AndroidConfig.defaultConfig.targetSdkVersion versionCode AndroidConfig.defaultConfig.versionCode versionName AndroidConfig.defaultConfig.versionName ... } ... } dependencies { ... implementation OtherLibs.appcompat ... }
标注:
- 为何目录名一定要是buildSrc:当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。然后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中。
优点:
- 支持双向跟踪
- buildSrc是Android默认插件,全局只有这一个地方可以修改
- 支持Android Studio的代码补全
缺点:
-
buildSrc 依赖更新将重新构建整个项目,项目越大,重新构建的时间就越长。
-
Gradle Composite builds
它的目录结构上跟buildSrc基本一致,
-
创建一个module,名称自定义,我这里就叫version
-
在 version 的 build.gradle 文件加入
buildscript { repositories { jcenter() google() } 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" } gradlePlugin { plugins { version { // 包名 id = 'com.demo.version' //在根目录下创建类 DependencyVersionPlugin 继承 Plugin<Project> implementationClass = 'com.demo.version.DependencyVersionPlugin' } } }
-
创建DependencyVersionPlugin类,继承Plugin<Project>(这里可以写一些逻辑处理,比如根据环境配置对应的key)
class DependencyVersionPlugin : Plugin<Project> { override fun apply(project: Project) { } }
- 创建kt文件,包含依赖包和版本号(和buildSrc的一样)
- 在 settings.gradle 文件内添加
includeBuild("versionPlugin")
(重点) - 在module的build.gradle中使用
plugins { id 'com.android.application' id 'kotlin-android' //导入包名 id 'com.lsy.version' } //导入依赖类 import com.lsy.version.AndroidConfig android { compileSdkVersion AndroidConfig.compileSdkVersion buildToolsVersion AndroidConfig.buildToolsVersion defaultConfig { applicationId AndroidConfig.defaultConfig.applicationId minSdkVersion AndroidConfig.defaultConfig.minSdkVersion targetSdkVersion AndroidConfig.defaultConfig.targetSdkVersion versionCode AndroidConfig.defaultConfig.versionCode versionName AndroidConfig.defaultConfig.versionName ... } ... } dependencies { ... implementation OtherLibs.appcompat ... }
优点:
-
支持单向跟踪
-
自动补全
- 依赖更新时,不会重新构建整个项目