Android—统一依赖版本管理

news2025/1/13 14:11:33

依赖版本管理有多种方式

  • 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.coloradmin.cn/o/1623539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

48-70V降12V/33V 5A高效同步降压DC-DC——AH1007

AH1007是一款高效率、高压外置MOSFET管降压芯片TEL:186*4884*3702*,芯片典型输入是8V~100V,输出 电压可调,AH1007最大输出电流可支持6A以上,需要注意板子的散热和温升。 AH1007典型开关频率为150KHz。轻载时会自动降低开关频率以…

如何把MP3音频转AAC?超级简单的音频格式转换方法在这里

在数字化时代,音乐文件的格式多种多样,每种格式都有其独特的特点和优势。其中,MP3和AAC是两种非常常见的音频格式。MP3由于其较小的文件大小和良好的音质,在过去几十年中一直备受欢迎。然而,随着技术的进步和音频编码算…

掼蛋游戏中的坏习惯

掼蛋是一款需要团队合作和策略思考的游戏,已经成为很多人的日常休闲娱乐方式。然而在日常掼蛋游戏中,有些玩家可能会做出一些不良举动,影响游戏的进行。我们列举了一些常见的坏习惯,希望玩家能够注意并且避免。 1、随意退出 有些玩…

SpringCloud之Feign集成Ribbon

Feign定义【可跳过】 Spring Cloud Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。其英文表意为“假装,伪装,变形”,是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求&#x…

Capture CIS设计小诀窍系列--Capture CIS配置-数据库搭建及ODBC配置

背景介绍:在原理图设计过程中,如果物料信息出现问题,导致BOM错误或者原理图符号、封装不对应,可能会导致项目延期甚至生产事故,严重影响产品设计效率。而Capture CIS原理图设计工具提供的CIS(Component Information Sy…

排队算法的matlab仿真,带GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 M/M/1 单服务台单通道排队模型 4.2 M/M/k 多服务台排队模型 4.3 M/G/1 和 G/M/1 模型 5.完整程序 1.程序功能描述 排队算法的matlab仿真,带GUI界面。分别仿真单队列单服务台&#xff…

No system certificates available. Try installing ca-certificates.

一、错误重现 Certificate verification failed: The certificate is NOT trusted. No system certificates available. Try installing ca-certificates. 具体如图 系统环境是ubuntu:22.04 ARM架构 二、解决方法 1、先不要更换镜像源 直接设置 apt update apt -y instal…

使用 ollama 部署最新的Llama 3 70B本地模型

一、ollama是什么? 在本地启动并运行大型语言模型。运行Llama 3,Mistral, Gemma, Code Llama和其他模型。自定义并创建您自己的。 综合优点: 快速下载容器自动运行大模型,现在下载,马上上手。本地利用 cpu 运行大模型&#xff0c…

【Docker】Docker Network(网络)

文章目录 一、Docker为什么需要网络管理二、Docker网络架构简介CNMLibnetwork驱动 三、常见网络类型四、Docker网络管理命令docker network createdocker network inspectdocker network connectdocker network disconnectdocker network prunedocker network rmdocker network…

实验6 用例图

一、实验目的 1、通过绘制用例图,掌握其基本原理。 2、能对简单问题进行用例图分析,并描绘用例。 二、实验项目内容(实验题目) 1、用Microsoft Visio绘制下列描述文字的用例图。 “远程网络教学系统”的功能需求如下: 学生登…

腾讯清华联合打造Eurus:用偏好树推进大语言模型的推理能力大突破

目录 引言:推动开源大型语言模型(LLMs)在复杂推理任务中的发展 EURUS模型介绍 ULTRAINTERACT数据集的创新 EURUS在多个推理任务中的表现分析 偏好学习在推理任务中的应用和影响 EURUS-RM-7B奖励模型的评估 结论:EURUS系列模型的创新点和对开源推理…

kubernetes中DaemonSet控制器

一、概念 使用DaemonSet控制器,相当于在节点上启动了一个守护进程。通过DaemonSet控制器可以确保在每个节点上运行Pod的一个副本。如果有心的node节点加入集群,则DaemonSet控制器会自动给新加入的节点增加一个Pod的副本;反之,当有…

SKF 与KISSSOFT的连接

SKF 与KISSSOFT的连接 HEDZER TILLEMA,荷兰SKF B.V.产品线经理 最近(2019年),瑞典滚动轴承制造商斯凯孚(SKF)和瑞士齿轮箱设计软件开发商KISSsoft已将斯凯孚的轴承计算服务整合到KISSsoft的软件中。借助 K…

轻松实现宅急送快递信息自动查询

在日常生活中,我们经常需要查询快递信息,而传统的查询方式往往需要我们手动输入每一个运单号,这种方式不仅繁琐,而且效率低下。那么,有没有一种方法可以让我们更快速、更便捷地查询快递信息呢?答案是肯定的…

【Python】异常、模块与包

目录 捕获异常 异常的传递 Python中的模块 模块的导入方式 as定义别名 自定义模块 Python包 第三方包 综合案例 当我们的程序遇到了BUG, 那么接下来有两种情况: ① 整个程序因为一个BUG停止运行 ② 对BUG进行提醒, 整个程序继续运行 但是在真实工作中, 我们肯定不能…

【Spring Security系列】Spring Security整合JWT:构建安全的Web应用

前言 在企业级开发或者我们自己的课程设计中,确保用户数据的安全性和访问控制非常重要。而Spring Security和JWT是都两个强大的工具,它俩结合可以帮助我们实现这一目标。 Spring Security提供了全面的安全功能,而JWT则是一种用于身份验证的…

(C++) this_thread 函数介绍

文章目录 &#x1f6a9;前言⭐std::this_thread&#x1f579;️get_id()&#x1f5a5;️Code&#x1f516;get_id介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep_for<>()&#x1f5a5;️Code&#x1f516;sleep_for介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep…

第三节课,后端登录【1】

一、总任务 二、登录接口 get 请求&#xff0c;有缺陷&#xff0c;长度有限制 三、登录逻辑 四、代码书写位置 4.1 编写业务逻辑的位置 五、写代码 5.1 代码1 5.1.1 细节 按 CtrlAltShiftL ,快速格式化 5.1. 2 自动生成接口参数 先/** 再回车 效果图 5.2 按 alt enter …

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

ubuntu无法用快捷键启动终端(CTRL+AIT+T)

我的电脑不知道安装什么东西之后&#xff0c;就不能用快捷键&#xff08;CTRLAITT&#xff09;打开终端了 只能在文件夹内&#xff0c;点击鼠标右键选择终端&#xff0c;然后打开终端 一直这么用了几个月&#xff0c;今天实在受不了了&#xff0c;所以解决此问题 本文参考文章…