Android—统一依赖版本管理

依赖版本管理有多种方式

  • config.gradle

        用于Groovy DSL,新建一个 config.gradle 文件,然后将项目中所有依赖写在里面,更新只需修改 config.gradle文件内容,作用于所有module

  • buildSrc

        可用于Kotlin DSL或Groovy DSL,对于多项目构建,只有一个 buildSrc 目录,该目录必须位于根项目目录中,Gradle 会自动编译并测试目录代码

  • version catalog

         可用于Kotlin DSL或Groovy DSL,与config.gradle类似,缺点是要求gradle版本在7.4.2以上

这里只介绍config.gradle和version catalog

一.原gradle

1.Groovy DSL:
plugins {
    id 'com.android.application'
}

android {
    namespace 'com.example.myapplication'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        targetSdk 33
        versionCode 1
        versionName "1.0"

        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
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.navigation:navigation-fragment:2.5.3'
    implementation 'androidx.navigation:navigation-ui:2.5.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
2.Kotlin DSL: 
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.example.myapplication"
    compileSdk = 33

    defaultConfig {
        applicationId = "com.example.myapplication"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = 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
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.11.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
    implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

二.config.gradle

1.先在根目录创建config.gradle文件

2.根据自己的依赖情况填写config.gradle

在config.gradle中我们还可以定义方法,做到某些关键字可以动态定义,假设我们有多buildTypes的应用,我们可以通过这种方式输出不同的版本名称,版本号等等。

ext {
    AppDemoDebug = "debug"
    AppDemoRelease = "release"
    versionCode = 1

    android = [
            applicationId            : "com.example.myapplication",
            compileSdk               : 34,
            minSdk                   : 24,
            targetSdk                : 33,
            versionCode              : versionCode,
            versionName              : getVersionName(),
            testInstrumentationRunner: "androidx.test.runner.AndroidJUnitRunner",
    ]

    version = [
            material        : "1.11.0",
            core            : "1.9.0",
            appcompat       : "1.6.1",
            constraintlayout: "2.1.4",
            navigation      : "2.5.3",
            navigation_ui   : "2.5.3",
            junit           : "4.13.2",
            test_ext        : "1.1.5",
            espresso        : "3.5.1"
    ]

    dependencies = [
            material        : "com.google.android.material:material:$version.material",
            core            : "androidx.core:core-ktx:$version.core",
            appcompat       : "androidx.appcompat:appcompat:$version.appcompat",
            constraintLayout: "androidx.constraintlayout:constraintlayout:$version.constraintLayout",
            navigation      : "androidx.navigation:navigation-fragment-ktx:$version.navigation",
            navigation_ui   : "androidx.navigation:navigation-ui-ktx:$version.navigation_ui",
            test_junit      : "junit:junit:$version.junit",
            test_ext        : "androidx.test.ext:junit:$version.test_ext",
            test_espresso   : "androidx.test.espresso:espresso-core:$version.espresso",
    ]
}

def getVersionName() {
    String taskName = getGradle().getStartParameter().getTaskRequests().toString()
    if (taskName.contains(AppDemoDebug)) {
        return versionCode + "_" + releaseTime() + "_DEBUG"
    } else {
        return versionCode + "_" + releaseTime() + "_RELEASE"
    }
}

static def releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
3.对内容进行关联

在项目层级的build.gradle中增加 apply from:"config.gradle"

如果config.gradle内存书写有错误,则会在这个时候报错,根据错误内容修改文件就行了

 4.对内容进行引用

引用后的build.gradle文件,可以对照前面的Groovy DSL,所有的版本号和依赖都引用了config.gradle,以此进行统一管理。

但是有明显的缺点是

  1. 点击无法跳转到config.gradle对应关键字。
  2. 依赖没有升级提示。

优点就是可以动态定义版本名称等。

//file:noinspection DependencyNotationArgument
plugins {
    id 'com.android.application'
}

android {
    namespace rootProject.ext.android.applicationId
    compileSdk rootProject.ext.android.compileSdk

    defaultConfig {
        applicationId  rootProject.ext.android.applicationId
        minSdk rootProject.ext.android.minSdk
        targetSdk rootProject.ext.android.targetSdk
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {
    implementation rootProject.ext.dependencies.appcompat
    implementation rootProject.ext.dependencies.material
    implementation rootProject.ext.dependencies.constraintLayout
    implementation rootProject.ext.dependencies.navigation
    implementation rootProject.ext.dependencies.navigation_ui
    testImplementation rootProject.ext.dependencies.test_junit
    androidTestImplementation rootProject.ext.dependencies.test_ext
    androidTestImplementation rootProject.ext.dependencies.test_espresso
}

三.version catalog

1.在gradle目录下创建libs.versions.toml文件

2.根据自己的依赖情况填写libs.versions.toml
[versions]
#plugins-version
application = "8.1.3"
kotlin = "1.9.0"
#config-version
applicationId = "com.example.myapplication"
compileSdk = "34"
minSdk = "24"
targetSdk = "33"
versionCode = "1"
versionName = "1.0"
#dependence-version
material = '1.11.0'
core = '1.9.0'
appcompat = '1.6.1'
constraintlayout = '2.1.4'
navigation = '2.5.3'
navigation-ui = '2.5.3'
junit = '4.13.2'
test-ext = '1.1.5'
espresso = '3.5.1'

[libraries]
android-material = { module = "com.google.android.material:material", version.ref = "material" }
androidx-core = { module = "androidx.core:core-ktx", version.ref = "core" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
navigation = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navigation" }
navigation-ui = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navigation-ui" }
test-junit = { module = "junit:junit", version.ref = "junit" }
test-ext = { module = "androidx.test.ext:junit", version.ref = "test-ext" }
test-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" }

[bundles]
android-test = ["test-ext","test-espresso"]
androidx-navigation = ["navigation", "navigation-ui"]

[plugins]
appliaction = { id = "com.android.application", version.ref = "application" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

        该文件分了四个板块,[versions],[libraries],[bundles],[plugins],bundles的作用是将libraries中你觉得可以绑定到一起的引用绑定到一块,在build.gradle中引用时,只引用bundle的值就行,相当于一次引用多个libraries。

        该文件不需要进行关联,gradle会自动识别****.toml文件,所以只要按这个格式命名就行。

3. 对内容进行引用
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.appliaction)
    alias(libs.plugins.kotlin.android)
}

android {
    namespace = "com.example.myapplication"
    compileSdk = Integer.parseInt(libs.versions.compileSdk.get())

    defaultConfig {
        applicationId = libs.versions.applicationId.get()
        minSdk = Integer.parseInt(libs.versions.minSdk.get())
        targetSdk = Integer.parseInt(libs.versions.targetSdk.get())
        versionCode = Integer.parseInt(libs.versions.versionCode.get())
        versionName = libs.versions.versionName.get()

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = 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
    }
}

dependencies {
    implementation(libs.androidx.core)
    implementation(libs.androidx.appcompat)
    implementation(libs.android.material)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.bundles.androidx.navigation)
    testImplementation(libs.test.junit)
    androidTestImplementation(libs.bundles.android.test)
}

引用后的build.gradle文件,可以对照前面的Kotlin DSL,所有的版本号和依赖都引用了libs.versions.toml,以此进行统一管理。version catalog弥补了config.gradle的缺点,可支持跳,在文件中也可以看到引用的升级建议:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/573195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里服务器centos7宝塔部署docker-compose项目

这里写目录标题 整体项目所使用的服务如下阿里云服务器操作安装宝塔面板小程序docker部署如果报错容器数量显示0 最近搞了个AI角色游戏的小程序,玩一玩练练手,因为项目需要复制部署,就研究下了docker,然后客户很多都是宝塔&#x…

【CMU15-445 Part-19】Multi-Version Concurrency Control

Part19-Multi-Version Concurrency Control 其实说到底 MVCC不仅是一种并发控制协议,更是一个系统构建(数据组织的方法)。 简介 writer 不会 block readers,reader 也不会 block writers。只读事务可以读到一个consistent的sna…

Clion连接MySQL数据库:实现C/C++语言与MySQL交互

确保你的电脑里已经有了MySQL。 1、找到MySQL的目录 2、进入lib目录 3、复制libmysql.dll和libmysql.lib文件 4、将这俩文件粘贴到你的clion项目的cmake-build-debug目录下 如果不是在这个目录下,运行时会出以下错误报错: 进程已结束,退…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了,这边的项目设计完全按照作者自己的喜好来进行定义和设置的,所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart,因为quickstart生成的api名字是greet,改起来…

抗D盾是什么,为什么游戏被攻击了需要抗D盾

游戏行业DDoS攻击的主要原因是因为游戏产品生命周期偏短,而DDoS供给成本又不高,只要发起攻击,企业为确保游戏稳定运营而不得不快速做出让步,致使敲诈勒索的成功率相对更高。在遭受DDoS攻击后,游戏公司的日损失甚至多达…

c4d渲染动画可以暂停吗?c4d云渲染动画怎么暂停

C4D是一款广泛应用于3D建模和动画制作的软件。在进行动画渲染时,用户有时会希望能够暂停渲染过程,以便进行其他操作或调整渲染设置。根据搜索结果,C4D在渲染动画时确实支持暂停功能。 一、c4d渲染动画怎么暂停 1、暂停渲染 C4D允许用户在渲…

druid数据库连接池配置项说明

目录 一、druid简介 二、引入druid数据库连接池 三、druid数据库连接池配置项说明 1. initialSize 2.maxWait 3.validationQuery 4.testWhileIdle,testOnBorrow,testOnReturn 5.timeBetweenEvictionRunsMillis 6.minEvictableIdleTimeMillis 7…

linux 驱动-匹配2 (amba_bustype)

目录 1.实例分析 a. 设备树实例 b. 驱动实例 2. amba匹配流程 a. 创建amba_device b. 确定总线以及总线的匹配函数 c. 分析总线的匹配函数 1.实例分析 a. 设备树实例 serial7e201000 { compatible "brcm,bcm2835-pl011\0arm,pl011\0arm,primecell"; //创建am…

Nginx 四层和七层代理区别、配置

四层:通过报文中的目标地址和端口,加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器,使用tcp、udp协议。 七层:"内容交换",通过报文中真正有意义的应用层内容,加上负…

【vue,unapi】UniApp引入全局js实现全局方法,全局变量

创建一个全局文件utils.js export const baseUrl "https://www.baidu.com/"export const fn () > {console.log("demo"); } export const obj {baseUrl : "https://www.baidu.com/",demo(){console.log("demo2");} }第一种&#…

基于opencv的单目相机标定

openCv版本:4.4.0 从源码处拷贝标定代码出来使用,需要拷贝samples/cpp/tutorial_code/calib3d/camera_calibration 需要的文件如下: -rw-rw-r-- 1 rog rog 28490 Jul 18 2020 camera_calibration.cpp -rw-rw-r-- 1 rog rog 3152 Jul 18 …

LearnOpenGL(五)之变换

一、缩放(Scaling) 把缩放变量表示为 (S1,S2,S3), 将任意向量 (x,y,z) 定义一个缩放矩阵,缩放公式: 二、位移 和缩放矩阵一样,在44矩阵上有几个特别的位置用来执行特定的操作,对于位移来说它们…

通过matlab对比遗传算法优化前后染色体的变化情况

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 通过matlab对比遗传算法优化前后染色体的变化情况. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....................................…

JVM(Java虚拟机)练习题目大全

1、什么是Java虚拟机(JVM)?它的作用是什么? Java虚拟机是Java平台的关键组件之一,它是一个能够执行Java字节码的虚拟计算机。其作用是提供一个跨平台的运行环境,使得Java程序可以在不同的操作系统上运行&a…

javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…

5月计算机各省报名时间汇总报名流程

📣5月有5省可进行计算机报名 天津:5月6日-5月10日 福建:5月6日9:00-5月12日17:00 广西:5月6日9:00-5月12日23:55 重庆:5月6日9:00-5月12日24:00 西藏:预计5月6日-12日 🔍计算机等级考试报…

【智能算法应用】灰狼算法(GWO)在低照度图像增强中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法(GWO)原理及实现 2.数学模型 对于低照度图像的增强方式可以采用非线性变换函数来对图像的灰度值进行变化,对于不同环境下质量不同的图像,可以将…

Flink 实时数仓(一)【实时数仓离线数仓对比】

前言 昨天技术面的时候,面试官说人家公司现在用的都是最新的技术,比如 Doris 等一些最新的工具,确实这些课是学校永远不会开设的,好在他说去了会带着我做一做。可是 ...... 学院舍不得让走啊 ...... 没办法,情况就是这…

LVGL基础到进阶

GUI 简介 图形用户界面, 是指代采用图形方式现实的计算机操作用户界面 GUI库: 图形用户界面库,只需调用GUI库的函数就看也i快速绘制出所需要的用户界面 优势: 开发难度低可移植性风格统一、协调 常见GUI库 emVinLVGLtouchGF…

传统行业还在使用FTP传输?试试这套FTP替代传输解决方案!

在数字化转型的浪潮中,传统企业对文件传输的需求日益增长。然而,许多企业仍在使用传统的文件传输协议(FTP)来处理文件传输任务。尽管FTP在早期被广泛采用,但其固有的弊端逐渐成为企业发展的桎梏,所以找一个…