美文网首页
android 依赖统一管理

android 依赖统一管理

作者: 浮在倥茽魡尐年 | 来源:发表于2023-01-27 22:04 被阅读0次

    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
    \color{Red} {注意:kotlin语言和Java的build.gradle配置有所差别 }
    versionplugin moudle \color{Red} {根目录下最好添加settings.gradle} 不然在项目clean project 的时候会报错

    image.png

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

    \color{Red} {Java版本versionplugin}

    image.png
    plugins {
        id 'java-gradle-plugin'
    
    }
    dependencies {
        implementation gradleApi()
    }
    
    gradlePlugin {
        plugins {
            version {
                id = 'com.dlh.versionplugin'
                implementationClass = 'com.dlh.versionplugin.VersionPlugin'
            }
        }
    }
     
    

    \color{Red} {kotlin版本versionKotlinPlugin}

    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类 并添加依赖包
    \color{Red} {Java版本versionplugin}

    image.png
    VersionPlugin
    package com.dlh.versionplugin;
    
    import org.gradle.api.Plugin;
    import org.gradle.api.Project;
    
    public class VersionPlugin implements Plugin<Project> {
    
        @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";
    }
    

    \color{Red} {kotlin版本versionKotlinPlugin}

    image.png
    VersionKotlinPlugin
    package com.dlh.versionkotlinplugin
    
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    class VersionKotlinPlugin: Plugin<Project> {
        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 依赖统一管理

          本文链接:https://www.haomeiwen.com/subject/yvbehdtx.html