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项目的依赖步骤如下:

  1. 在Android项目根目录下创建buildSrc目录,然后make项目,buildSrc目录下会自动创建一些文件

  2. 在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"
    
    
  3. 在buildSrc目录下创建build.gradle.kts文件,加入如下代码:

    plugins 
        `kotlin-dsl`
    
    repositories
        jcenter()
    
    
  4. 在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方式

这种方式管理依赖的步骤如下:

  1. 在项目根目录下创建一个新的Java Library,这里我取名为version-plugin,包名为com.example.plugin

  2. 修改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'
            
        
    
    
  3. 在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"
    
    
  4. 在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接口的一个空实现,但是一定要有,否则后面的构建会报错。

  5. 在Android项目根目录下的settings.gradle文件中,添加如下配置:

    includeBuild("version-plugin")
    

    注意删除之前创建version-plugin时自动在这个文件中添加的include ':version-plugin'配置。

  6. 在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项目管理依赖方式总结的主要内容,如果未能解决你的问题,请参考以下文章

Android项目管理依赖方式总结

Android项目管理依赖方式总结

Android项目管理依赖方式总结

Android - 依赖统一管理

依赖是危险的吗? [关闭]

Android Gradle 三方依赖管理详解