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 34defaultConfig {applicationId "com.example.myapplication"minSdk 24targetSdk 33versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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 = 33defaultConfig {applicationId = "com.example.myapplication"minSdk = 24targetSdk = 33versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = 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 = 1android = [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.applicationIdcompileSdk rootProject.ext.android.compileSdkdefaultConfig {applicationId  rootProject.ext.android.applicationIdminSdk rootProject.ext.android.minSdktargetSdk rootProject.ext.android.targetSdkversionCode rootProject.ext.android.versionCodeversionName rootProject.ext.android.versionNametestInstrumentationRunner rootProject.ext.android.testInstrumentationRunner}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}buildFeatures {viewBinding true}
}dependencies {implementation rootProject.ext.dependencies.appcompatimplementation rootProject.ext.dependencies.materialimplementation rootProject.ext.dependencies.constraintLayoutimplementation rootProject.ext.dependencies.navigationimplementation rootProject.ext.dependencies.navigation_uitestImplementation rootProject.ext.dependencies.test_junitandroidTestImplementation rootProject.ext.dependencies.test_extandroidTestImplementation 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 = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = 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.mzph.cn/news/829799.shtml

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

相关文章

MATLAB冒号表示法

MATLAB 冒号表示法 colon(:)是在MATLAB中最有用的运算符之一。它用于创建向量,下标数组和指定迭代。 如果要创建包含1到10的整数的行向量,请编写- 示例 1:10 MATLAB执行该语句并返回包含1到10的整数的行向量- ans 1 2 3 4 5 6 7 8 9 10 如果要指定一…

github Copilot的使用总结

1. 代码建议和补全 GitHub Copilot 的基本使用涉及编写代码时的实时代码建议和补全。一旦你已经安装并配置好 GitHub Copilot 插件,你可以在支持的编辑器(如 Visual Studio Code)中开始使用 Copilot。以下是一些基本的使用步骤: …

VBA技术资料MF146:发出多次Beep提示声

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

K8S 部署和访问 Kubernetes 仪表板(Dashboard)

文章目录 部署 Dashboard UI浏览器访问登陆系统 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览…

unit4.web服务的部署及高级优化方案

搭建web服务器要求如下: 1.web服务器的主机ip:172.25.254.100 [rootserver101 桌面]# vmset.sh 100 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3) [rootserver101 桌面]# ifc…

鑫海移民荣耀呈现:EB5投资移民盛宴落幕,卓越项目引领投资新潮

随着春日的暖阳渐渐铺满大地,我们鑫海移民集团在这个充满希望的季节里,举办了一场意义非凡的EB5投资移民专题活动。于2024年4月27日(周六)下午13:30,在北京渤海润泽威斯汀酒店隆重举行,我们与众多热情的参与…

基于java的商店积分管理系统的设计与实现

功能需求 从功能上可以划分为个人信息管理、商店管理、平台管理、订单管理和数据分析。后台管理系统主要服务于商户和平台管理员,兑换用户是属于商户平台的自有用户,不会被纳入到后台管理系统中来。商户用户可以对自己的积分进行管理,平台管…

echarts下载图片

toolbox: {show: true,//展示工具栏itemSize:20,//icon的大小iconStyle:{borderColor:"#409eff",borderWidth:"3",color:"#fff"},right:"40px",//偏移位置feature: {saveAsImage: {title: "下载图表", //鼠标滑过之后文案na…

用wps自带工具给图片做标注

在wps中,选中wps中的图片,右键选择【编辑】进入图片编辑器,在选项卡面板右侧选择【标注】工具,再选择【添加文本】工具,即可直接在图片上输入文字,标注完成后选择【覆盖原图】就完成标注任务。

【Canvas与艺术】绘制美国星条旗

注意&#xff1a; 该图位置和大小都是按照网上说明精确绘制的。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使…

FA-128晶振用于医疗设备

血糖仪已成为家庭常用的医疗设备,日本爱普生晶振公司生产的2016封装,32MHz贴片晶振可完美应用于医疗器械血糖仪,此款晶振订货型号为X1E000251005900晶振,型号为FA-128,负载电容分8PF,精度10PPM,其尺寸参数为2.0x1.6x0.5mm,符合ROHS标准且无铅,具有封装尺寸超小,高精度,频率范围…

C++ | Leetcode C++题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canJump(vector<int>& nums) {int n nums.size();int rightmost 0;for (int i 0; i < n; i) {if (i < rightmost) {rightmost max(rightmost, i nums[i]);if (rightmost > n - 1) {r…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…

[vant] 图片预览关闭按钮显示不正常

如果这里显示不正常, 那就应该是按照文档引入了 显示有问题, 直接不引入, 声明一下就行

每日论文推荐:我们距离GPT-4V有多远,最接近GPT-4V的开源多模态大模型

&#x1f4cc; 元数据概览&#xff1a; 标题&#xff1a;How Far Are We to GPT-4V? Closing the Gap to Commercial Multimodal Models with Open-Source Suites作者&#xff1a;Zhe Chen, Weiyun Wang, Hao Tian, Shenglong Ye, Zhangwei Gao, Erfei Cui, Wenwen Tong, Kon…

企业计算机服务器中了helper勒索病毒怎么办?Helper勒索病毒解密处理流程

网络技术的不断发展与成熟&#xff0c;为企业的生产运营提供了极大便利&#xff0c;让企业的发展速度大大提升&#xff0c;但网络毕竟是虚拟服务系统&#xff0c;虽然可以为企业提供便利&#xff0c;但也会给企业数据安全带来严重威胁。近日&#xff0c;云天数据恢复中心接到山…

c++中的链表list的模拟实现

拖更了半个月&#xff0c;我终于来填c的坑啦。上次我们说的vetcor不知道小伙伴还记得多少呢&#xff1f;今天我们要讲list的模拟实现。 目录 架构结点list表的结构 构造函数尾插push_back()尾删pop_back()计算个数&#xff1a;size()判断空empty()※迭代器问题普通迭代器迭代器…

CSS高级选择器

一、属性选择器 以value开头的att属性的E元素&#xff1a;E[att^"value"]{ ;} a[href^http]{background-color"red";} css a[href^http]{background-color"red"; } html <!DOCTYPE html> <html lang"en"> <head&…

《QT实用小工具·四十四》支持图片和动图的文本编辑器

1、概述 源码放在文章末尾 该项目实现了一个功能丰富的文本编辑器&#xff0c;除了包含文本常规的编辑功能&#xff0c;还包括图片的插入功能和动图的插入功能&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "imagehelper.…