android 依赖统一管理

Android依赖统一管理的方式有以下几种方式

1.groovy ext扩展函数
2.kotlin+buildSrc
3.composing builds
4.catalog

groovy ext扩展函数

1.在项目的根目录下创建一个config.gradle

image.png

// 修改根目录下的config.gradle文件如下:

ext {
    // 定义所有依赖库的版本
    versions = [

            constraintlayout_version: '2.1.3',
    ]

    // 定义所有依赖库的全路径
    deps = [

            constraintlayout: "androidx.constraintlayout:constraintlayout:${versions.constraintlayout_version}"
    ]
}

2.在项目的根目录下的build.gradle 中引用
apply from: './config.gradle'


image.png

3.在项目中的module中的使用


image.png

总结:

优点:

1:后续添加依赖不需要改动build.gradle,直接在config.gradle

2:精简了build.gradle的长度

缺点:

1:不支持代码提醒

2:不支持点击跳转

3:多moudle 开发时,不同module的依赖需要ctrl+c/v 导致开发的效率降低

kotlin+buildSrc

1、创建buildSrc moudle


image.png

2、删除或注释掉根目录下settings.gradle文件的 include ':buildSrc'


image.png

3、修改buildSrc moudle 下面build.gradle 修改成 build.gradle.kts

plugins {
     `kotlin-dsl`
}
image.png

image.png

删除libs
删除包com.dlh.buildsrc和包下面的文件MyClass
新建文件Dependencies.kt


image.png

在Dependencies.kt 定义依赖
image.png
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.依赖引用

image.png

总结:

优点:

1:但这种方式支持IDE,输入代码会有提示,会自动完成,所以非常推荐使用这种方式来管理项目中的依赖包

2:支持 AndroidStudio 单击跳转

缺点:

buildSrc 是对全局的所有 module 的配置依赖更新会重新构建整个项目,项目越大,重新构建的时间就越长,造成不必要的时间浪费。

composing builds

1、创建 versionplugin moudle

versionplugin moudle 不然在项目clean project 的时候会报错

image.png

2.修改versionplugin moudle下面的 build.gradle


image.png

plugins {
    id 'java-gradle-plugin'

}
dependencies {
    implementation gradleApi()
}

gradlePlugin {
    plugins {
        version {
            id = 'com.dlh.versionplugin'
            implementationClass = 'com.dlh.versionplugin.VersionPlugin'
        }
    }
}
 


image.png

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


image.png
includeBuild('versionplugin')
或者
includeBuild('versionKotlinPlugin')

4.修改versionplugin VersionPlugin类 并添加依赖包

image.png

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";
}


image.png

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引用

image.png

image.png
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')
image.png

配置依赖包

versionCatalogs {
        libs {
            version("minSdk","21")
            version('compileSdk','30')
            version('targetSdk','30')

            library('retrofit','com.squareup.retrofit2:retrofit:2.9.0')

        }
    }

2.引用依赖


image.png

Demo地址:denglihua90/DLHDependenciesDemo (github.com)

你可能感兴趣的:(android 依赖统一管理)