Android项目管理依赖方式总结
Posted yubo_725
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android项目管理依赖方式总结相关的知识,希望对你有一定的参考价值。
随着android项目越来约大,管理项目中依赖的三方库成了一个非常重要的部分,若管理不当,不同module中可能会依赖同一个库的不同版本,这将导致非常严重的问题,要么是代码冲突,要么是APK包体积增大,亦或是项目构建的时间变长,拖慢开发效率。使用好的方式管理Android项目的依赖库显得尤其重要,本文记录了当下几种不同的管理Android依赖的方法,希望跟大家一起学习进步!
原始方式
这种管理依赖的方式是我们以前用得最多的,即直接将依赖的库写在module的build.gradle文件中,如下代码所示:
implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2"
implementation "org.greenrobot:eventbus:3.2.0"
implementation "com.github.bumptech.glide:glide:4.12.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"
implementation "io.reactivex.rxjava3:rxjava:3.0.13"
implementation "com.tencent:mmkv-static:1.2.10"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
这种管理依赖的方式缺点非常明显,如果项目中有多个不同的module,你需要在多个module的build.gradle文件中都做对应的配置,还要确保依赖的库的版本号一致,配置项要重复编写多次。
Ext方式
这种方式是在项目根目录下创建config.gradle配置文件(你也可以取任意文件名),然后将项目中需要的依赖项统一放在这个配置文件中,再在根目录下的build.gradle中引用这个配置文件,比如下面的代码所示:
// 第一步:在项目根目录下创建config.gradle文件,内容如下
ext {
versions = [
okhttp_verison : '5.0.0-alpha.2',
eventbus_version: '3.2.0',
glide_version : '4.12.0',
rxjava_version : '3.0.13',
mmkv_version : '1.2.10',
retrofit_version: '2.9.0',
]
}
// 第二步:在项目根目录下的build.gradle文件中引用上面的config.gradle文件:
apply from: './config.gradle'
buildscript {
ext.kotlin_version = "1.5.20"
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
// 第三步:在module的build.gradle文件中引用
def vs = rootProject.ext.versions
dependencies {
implementation "com.squareup.okhttp3:okhttp:${vs.okhttp_version}"
implementation "org.greenrobot:eventbus:${vs.eventbus_version}"
implementation "com.github.bumptech.glide:glide:${vs.glide_version}"
annotationProcessor "com.github.bumptech.glide:compiler:${vs.glide_version}"
implementation "io.reactivex.rxjava3:rxjava:${vs.rxjava_version}"
implementation "com.tencent:mmkv-static:${vs.mmkv_version}"
implementation "com.squareup.retrofit2:retrofit:${vs.retrofit_version}"
}
这种方式的优点是,将所有依赖库的版本统一放到一个文件中管理了,若有多个不同的module,引用方式和上面第三步中一样,不会导致同一个库出现不同版本,但是上面第三步的配置在有多个module的情况下还是稍微有些冗余了,如果多个module中都需要用到okhttp,类似implementation "com.squareup.okhttp3:okhttp:${vs.okhttp_version}"
的配置代码就需要写多次了,针对这种情况可以做如下改进:
// 修改根目录下的config.gradle文件如下:
ext {
// 定义所有依赖库的版本
versions = [
okhttp_version : '5.0.0-alpha.2',
eventbus_version: '3.2.0',
glide_version : '4.12.0',
rxjava_version : '3.0.13',
mmkv_version : '1.2.10',
retrofit_version: '2.9.0',
]
// 定义所有依赖库的全路径
deps = [
okhttp : "com.squareup.okhttp3:okhttp:${versions.okhttp_version}",
eventbus : "org.greenrobot:eventbus:${versions.eventbus_version}",
glide : "com.github.bumptech.glide:glide:${versions.glide_version}",
glide_compiler: "com.github.bumptech.glide:compiler:${versions.glide_version}",
rxjava : "io.reactivex.rxjava3:rxjava:${versions.rxjava_version}",
mmkv : "com.tencent:mmkv-static:${versions.mmkv_version}",
retrofit : "com.squareup.retrofit2:retrofit:${versions.retrofit_version}",
]
}
// 然后在module的build.gradle文件中用下面的方式来引用:
def deps = rootProject.ext.deps
dependencies {
implementation deps.okhttp
implementation deps.eventbus
implementation deps.glide
annotationProcessor deps.glide_compiler
implementation deps.rxjava
implementation deps.mmkv
implementation deps.retrofit
}
这样的话,如果存在多个module都需要引用okhttp库,需要配置的代码就非常简短了,只需在每个module的build.gradle文件中都做这个配置即可:implementation deps.okhttp
第二种方式较第一种方式已经有很大的进步了,统一了依赖库的版本号和依赖项的全名,但是在AndroidStudio中,你会发现在写依赖项时,IDE没有给出代码提示,这虽然是个小问题,通过复制粘贴能确保不出错,但是依然有更好的办法来改进。
buildSrc方式
这种方式管理Android项目的依赖步骤如下:
-
在Android项目根目录下创建buildSrc目录,然后make项目,buildSrc目录下会自动创建一些文件
-
在buildSrc目录下新建
src/main/java
目录,在其中新建一个kt文件用于定义依赖版本和依赖项,代码如下:// Deps.kt object Versions { val okhttp = "5.0.0-alpha.2" val eventbus = "3.2.0" val glide = "4.12.0" val rxjava = "3.0.13" val mmkv = "1.2.10" val retrofit = "2.9.0" } object Deps { val okhttp = "com.squareup.okhttp3:okhttp:${Versions.okhttp}" val eventbus = "org.greenrobot:eventbus:${Versions.eventbus}" val glide = "com.github.bumptech.glide:glide:${Versions.glide}" val glideCompiler = "com.github.bumptech.glide:compiler:${Versions.glide}" val rxjava = "io.reactivex.rxjava3:rxjava:${Versions.rxjava}" val mmkv = "com.tencent:mmkv-static:${Versions.mmkv}" val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}" }
-
在buildSrc目录下创建build.gradle.kts文件,加入如下代码:
plugins { `kotlin-dsl` } repositories{ jcenter() }
-
在module的build.gradle文件中,可以这么引用依赖项了:
dependencies { implementation Deps.okhttp implementation Deps.eventbus implementation Deps.glide annotationProcessor Deps.glideCompiler implementation Deps.rxjava implementation Deps.mmkv implementation Deps.retrofit }
使用这种方式做依赖管理,你会发现在修改build.gradle文件时,会出现代码提示了,如下图所示:
buildSrc这种方式较前两种方式已经非常好了,它支持代码跟踪,编写依赖项时有代码提示,但是它并不是最完美的一种方式,因为如果某个依赖项版本做了更新,使用buildSrc方式会导致整个项目都重新构建,导致编译速度变慢。
Composing builds方式
这种方式管理依赖的步骤如下:
-
在项目根目录下创建一个新的Java Library,这里我取名为version-plugin,包名为com.example.plugin
-
修改version-plugin根目录下的build.gradle文件,内容如下:
buildscript { repositories { jcenter() } dependencies { // 因为使用的 Kotlin 需要需要添加 Kotlin 插件 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20" } } apply plugin: 'kotlin' apply plugin: 'java-gradle-plugin' repositories { // 需要添加 jcenter 否则会提示找不到 gradlePlugin jcenter() google() } dependencies { implementation gradleApi() implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20" } compileKotlin { kotlinOptions { jvmTarget = "1.8" } } compileTestKotlin { kotlinOptions { jvmTarget = "1.8" } } gradlePlugin { plugins { version { // 在 app 模块需要通过 id 引用这个插件 id = 'com.example.plugin' // 实现这个插件的类的路径 implementationClass = 'com.example.plugin.VersionPlugin' } } }
-
在version-plugin中的
src/main/java/com/example/plugin
目录下创建Deps.kt文件,内容如下:package com.example.plugin object Versions { val okhttp = "5.0.0-alpha.2" val eventbus = "3.2.0" val glide = "4.12.0" val rxjava = "3.0.13" val mmkv = "1.2.10" val retrofit = "2.9.0" } object Dependencies { val okhttp = "com.squareup.okhttp3:okhttp:${Versions.okhttp}" val eventbus = "org.greenrobot:eventbus:${Versions.eventbus}" val glide = "com.github.bumptech.glide:glide:${Versions.glide}" val glideCompiler = "com.github.bumptech.glide:compiler:${Versions.glide}" val rxjava = "io.reactivex.rxjava3:rxjava:${Versions.rxjava}" val mmkv = "com.tencent:mmkv-static:${Versions.mmkv}" val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}" }
-
在version-plugin中的
src/main/java/com/example/plugin
目录下创建VersionPlugin.kt文件,内容如下:package com.example.plugin import org.gradle.api.Plugin import org.gradle.api.Project class VersionPlugin : Plugin<Project> { override fun apply(target: Project) { } }
虽然这个类是对Plugin接口的一个空实现,但是一定要有,否则后面的构建会报错。
-
在Android项目根目录下的
settings.gradle
文件中,添加如下配置:includeBuild("version-plugin")
注意删除之前创建version-plugin时自动在这个文件中添加的
include ':version-plugin'
配置。 -
在module根目录下的build.gradle文件中引用上面创建的插件,然后就可以引用到插件里定义的依赖了,如下代码:
import com.example.plugin.Dependencies // 配置1 plugins { id 'com.android.application' id 'kotlin-android' id 'com.example.plugin' // 配置2 } // 下面就能引用插件中的Dependencies类中定义的常量了 dependencies { implementation Dependencies.okhttp implementation Dependencies.eventbus implementation Dependencies.glide annotationProcessor Dependencies.glideCompiler implementation Dependencies.rxjava implementation Dependencies.mmkv implementation Dependencies.retrofit }
这种方式是目前最为推荐的管理Android项目依赖的方式,它比buildSrc方式更优秀的地方在于,某个依赖项更新了不会触发整个项目的重新构建。
源码
https://github.com/yubo725/android-dependencies-demo
参考
以上是关于Android项目管理依赖方式总结的主要内容,如果未能解决你的问题,请参考以下文章