Android依赖统一管理的方式有以下几种方式
1.groovy ext扩展函数
2.kotlin+buildSrc
3.composing builds
4.catalog
groovy ext扩展函数
1.在项目的根目录下创建一个config.gradle
// 修改根目录下的config.gradle文件如下:
ext {
// 定义所有依赖库的版本
versions = [
constraintlayout_version: '2.1.3',
]
// 定义所有依赖库的全路径
deps = [
constraintlayout: "androidx.constraintlayout:constraintlayout:${versions.constraintlayout_version}"
]
}
2.在项目的根目录下的build.gradle 中引用
apply from: './config.gradle'
3.在项目中的module中的使用
总结:
优点:
1:后续添加依赖不需要改动build.gradle,直接在config.gradle
2:精简了build.gradle的长度
缺点:
1:不支持代码提醒
2:不支持点击跳转
3:多moudle 开发时,不同module的依赖需要ctrl+c/v 导致开发的效率降低
kotlin+buildSrc
1、创建buildSrc moudle
2、删除或注释掉根目录下settings.gradle文件的 include ':buildSrc'
3、修改buildSrc moudle 下面build.gradle 修改成 build.gradle.kts
plugins {
`kotlin-dsl`
}
删除libs
删除包com.dlh.buildsrc和包下面的文件MyClass
新建文件Dependencies.kt
在Dependencies.kt 定义依赖
object Versions {
val material="1.5.0"
val navigation_ktx="2.4.1"
}
object Libs {
val material="com.google.android.material:material:${Versions.material}"
val navigation_fragment_ktx="androidx.navigation:navigation-fragment-ktx:${Versions.navigation_ktx}"
val navigation_ui_ktx="androidx.navigation:navigation-ui-ktx:${Versions.navigation_ktx}"
}
4.依赖引用
总结:
优点:
1:但这种方式支持IDE,输入代码会有提示,会自动完成,所以非常推荐使用这种方式来管理项目中的依赖包
2:支持 AndroidStudio 单击跳转
缺点:
buildSrc 是对全局的所有 module 的配置依赖更新会重新构建整个项目,项目越大,重新构建的时间就越长,造成不必要的时间浪费。
composing builds
1、创建 versionplugin moudle
versionplugin moudle 不然在项目clean project 的时候会报错
2.修改versionplugin moudle下面的 build.gradle
plugins {
id 'java-gradle-plugin'
}
dependencies {
implementation gradleApi()
}
gradlePlugin {
plugins {
version {
id = 'com.dlh.versionplugin'
implementationClass = 'com.dlh.versionplugin.VersionPlugin'
}
}
}
buildscript {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
dependencies {
// 因为使用的 Kotlin 需要需要添加 Kotlin 插件 https://plugins.gradle.org/plugin/org.jetbrains.kotlin.kapt/1.6.10
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20" //gradle7.1.2 最高兼容kotlin1.6.21
}
}
plugins {
id 'java-gradle-plugin'
}
apply plugin: 'kotlin'
dependencies {
implementation gradleApi()
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20"
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
gradlePlugin {
plugins {
version {
// 在 app 模块需要通过 id 引用这个插件
id = 'com.dlh.versionkotlinplugin'
// 实现这个插件的类的路径
implementationClass = 'com.dlh.versionkotlinplugin.VersionKotlinPlugin'
}
}
}
3.修改项目根目录下面的 settings.gradle
includeBuild('versionplugin')
或者
includeBuild('versionKotlinPlugin')
4.修改versionplugin VersionPlugin类 并添加依赖包
VersionPlugin
package com.dlh.versionplugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class VersionPlugin implements Plugin {
@Override
public void apply(Project project) {
}
}
AndroidConfig
package com.dlh.versionplugin;
public class AndroidConfig {
// compileSdk 32
// minSdk 21
// targetSdk 32
// versionCode 1
// versionName "1.0"
public static String versionName = "1.0";
public static int versionCode=1;
public static int compileSdk=32;
public static int minSdk=21;
public static int targetSdk=32;
}
Deps
package com.dlh.versionplugin;
public class Deps {
public static String androidxCore="androidx.core:core-ktx:1.7.0";
}
VersionKotlinPlugin
package com.dlh.versionkotlinplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class VersionKotlinPlugin: Plugin {
override fun apply(project: Project) {
}
}
AndroidKotlinConfig
package com.dlh.versionkotlinplugin
object AndroidKotlinConfig {
// compileSdk 32
// minSdk 21
// targetSdk 32
// versionCode 1
// versionName "1.0"
var versionName = "1.0"
var versionCode = 1
var compileSdk = 32
var minSdk = 21
var targetSdk = 32
}
DepsKotlin
package com.dlh.versionkotlinplugin
object DepsKotlin{
const val androidxCore = "androidx.core:core-ktx:1.7.0"
const val appcompat="androidx.appcompat:appcompat:1.4.1"
}
5.moudle引用
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
//下面这行必须有,引用插件框架
id "com.dlh.versionplugin"//java
id 'com.dlh.versionkotlinplugin'//kotlin
}
//下面这行必须有,为了添加包下的类
import com.dlh.versionplugin.*
import com.dlh.versionkotlinplugin.*
android {
namespace 'com.dlh.dependenciesdemo'
// compileSdk AndroidKotlinConfig.compileSdk
compileSdk AndroidConfig.compileSdk
defaultConfig {
applicationId "com.dlh.dependenciesdemo"
minSdk libs.versions.minSdk.get().toInteger()
targetSdk AndroidKotlinConfig.targetSdk
versionCode AndroidKotlinConfig.versionCode
versionName AndroidKotlinConfig.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
// 在module的build.gradle文件中引用
def vs = rootProject.ext.versions
// 然后在module的build.gradle文件中用下面的方式来引用:
def config_deps = rootProject.ext.deps
dependencies {
implementation Deps.androidxCore
implementation DepsKotlin.appcompat
implementation Libs.material
implementation libs.retrofit
implementation config_deps.constraintlayout
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
总结:Composing builds只是包含其他构建的构建。 在许多方面,复合构建类似于Gradle多项目构建,不同之处在于,它包括完整的构建,而不是包括单个项目。
支持单向跟踪
自动补全
依赖更新时,不会重新构建整个项目
在gradle7.1以上我遇到引用的库的不能高亮,暂时没有去研究,有知道的愿意解答的可以评论留言
catalog versionCatalogs
1、Catalog仍然是一个孵化中的特性,gradle7.0才开始支持,如需使用:在项目根目录下settings.gradle开启配置
开启配置
enableFeaturePreview('VERSION_CATALOGS')
配置依赖包
versionCatalogs {
libs {
version("minSdk","21")
version('compileSdk','30')
version('targetSdk','30')
library('retrofit','com.squareup.retrofit2:retrofit:2.9.0')
}
}
2.引用依赖
Demo地址:denglihua90/DLHDependenciesDemo (github.com)