Android 统一依赖管理

本篇只是作记录。

  • 简述

每个项目从新建开始我们或多或少都会导入各种依赖库,如果项目中只有一个module的话,对于依赖库版本的管理很容易,但是多个module的话,稍加不注意,很容易导入多个版本的库甚至产生版本冲突,更新修改依赖库也需要多处操作,所以我们需要对依赖库版本进行统一管理。(就简单说一下,其实大家都理解)

  • 实现方案

实现依赖库版本的统一管理现在流行的方案大致有三种(有更好的方案,大家可以推荐下):

  1. ext(Google推荐)

  2. Kotlin + buildSrc

  3. 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

  1. 在根目录下创建一个目录buildSrc(名称必须是buildSrc,下面有解释)

  2. buildSrc目录中创建build.gradle.kts文件

    plugins {
        `kotlin-dsl`
    }
    
    repositories {
        mavenCentral()
        jcenter()
        google()
    }
  3. 创建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"
        }
    }
  4. 创建完成后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基本一致,

  1. 创建一个module,名称自定义,我这里就叫version

  2. 在 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'
            }
        }
    }

     

  3. 创建DependencyVersionPlugin类,继承Plugin<Project>(这里可以写一些逻辑处理,比如根据环境配置对应的key)

    class DependencyVersionPlugin : Plugin<Project> {
        override fun apply(project: Project) {
        }
    }

     

  4. 创建kt文件,包含依赖包和版本号(和buildSrc的一样)
  5. 在 settings.gradle 文件内添加 includeBuild("versionPlugin") (重点
  6. 在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
        ...
    }

     

优点:

  • 支持单向跟踪

  • 自动补全

  • 依赖更新时,不会重新构建整个项目

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值