当前位置: 首页 > news >正文

Android 依赖统一配置管理(Version Catalogs)

最近升级了Android Studio版本到Koala Feature Drop | 2024.1.2,新建项目后发现项目配置又有变化,默认开始使用了一个名叫 Gradle 版本目录的东西,当然也可以称之为依赖统一配置管理,一开始还有点陌生,但是经过一番了解之后,发现其实看着变化挺大,但总得来说还是比较容易上手,当然了之前的配置方式还是可以继续使用,但是官方既然推荐,那么还是很有必要学习下的,毕竟码农也还是要与时俱进的。

依赖统一配置管理

借助 Gradle 版本目录,您能够以可扩容的方式添加和维护依赖项和插件。使用 Gradle 版本目录,您可以在拥有多个模块时更轻松地管理依赖项和插件。您不必对各个 build 文件中的依赖项名称和版本进行硬编码,也不必在每次需要升级依赖项时都更新每个条目,而是可以创建一个包含依赖项的中央版本目录,各种模块可在 Android Studio 协助下以类型安全的方式引用该目录。

上面这一段是官方的描述,应该都能看明白,Gradle 版本目录新项目是通过名为libs.versions.toml的文件进行配置的,因此我们就先从该文件入口一步一步看看是如何配置和使用的。

依赖和插件配置方式

在项目中会多出来一个libs.versions.toml的文件,该文件的存放目录在项目根目录中的gradle文件夹中,其结构如下:

[versions]
...[libraries]
...[plugins]
...

不难看出内容结构分为三个部分,其作用如下:

[versions]: 定义了项目中使用的依赖项或者插件的版本变量。可以在后续代码块(libraries 和 plugins 代码块)中使用这些变量。

[libraries]: 定义了项目中需要使用的依赖项。(适用于远程二进制文件或本地库模块,貌似是废话~)。

[plugins]: 定义了项目中需要使用的插件。

接着让我们来用一个完整的示例来看它具体是如何配置依赖项和插件的:

[versions]
agp = "8.6.0"
appcompat = "1.6.1"[libraries]
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }

这里在[versions]中配置了两个版本号变量,一个是名为agp(安卓gradle插件)的版本为8.6.0,另一个是名为appcompat依赖的版本为1.6.1。

[libraries]中完整的配置了名为appcompat的依赖项变量,等号右边大括号中的version.ref则是对[versions]配置中的appcompat版本号的引用,然后group和name则是真实依赖的信息,完整的配置下来的话,依赖为:“androidx.appcompat:appcompat:1.6.1”。

[plugins]中完整的配置了名为android-application的插件变量,等号右边大括号中version.ref则引用了[versions]中配置的agp版本号,id这里就不再描述了~。

此外,关于变量命名方式,官方建议使用kebab case方式进行命名。

Kebab case(或称为snake case的全小写版本)是一种用于编写变量名、文件名和其他标识符的命名约定。在kebab case中,所有的字母都是小写的,并且每个单词之间用连字符(-)分隔。

说到这里,配置这块应该都有一个大致的了解了吧,如果还不明白的话,可以这么认为,libs.versions.toml是一个类,[versions]是一个键为String,值为String的公有集合;[libraries]是一个键为String,值为librarie对象(三个变量group、name、version)的公有集合;[plugins]是一个键为String,值为plugin对象(两个变量id、version)的公有集合,就跟我们用java或者kotlin写代码是一样的,这个类主要是用来通过这些变量和对象配置我们项目中需要引入的依赖或者插件信息,后续需要使用的时候通过这里配置的信息名称引用即可,可能我这个描述不不太恰当,但大致意思应该就是这样。

项目中引用

插件引用

插件引用,通过libs.plugins进行配置的插件变量的引用,并将变量名中的下划线和短划线转换为圆点。还是以上面的例子继续,插件的引入方式:

根目录下的build脚本:

plugins {alias(libs.plugins.android.application) apply false
}

模块下的build脚本:

plugins {alias(libs.plugins.android.application)
}

依赖引用

在需要添加依赖的模块中的 build 脚本中添加对依赖项别名的引用。从 build 脚本引用依赖变量时,需要以libs.开头进行访问,不需要包含 libraries 限定符,例如:

dependencies {implementation(libs.appcompat)
}

版本号引用

版本号引用需要以libs.versions开头进行引用, versions版本号引用,实际应该极少有使用的场景,其实跟上面两个类似,这里就不再举例了。

总结

以上就是本篇文章的全部内容。是不是觉得还是比较简单的,通过以上内容,想必有些同学也能看出来,使用依赖统一配置确实好处多多,特别是针对多module的项目,依赖集中管理、减少重复、提高可读性。更重要的是引用简单,可以显著提高依赖管理的可维护性。

相关文章:

Android 依赖统一配置管理(Version Catalogs)

最近升级了Android Studio版本到Koala Feature Drop | 2024.1.2,新建项目后发现项目配置又有变化,默认开始使用了一个名叫 Gradle 版本目录的东西,当然也可以称之为依赖统一配置管理,一开始还有点陌生,但是经过一番了解…...

如何为数据看板产品接入实时行情接口并展示行情

在金融科技领域,实时数据是分析和决策的关键因素。通过AllTick的实时行情API,您可以轻松将实时市场数据集成到数据看板产品中,为用户提供丰富的市场洞察。本文将详细介绍如何使用AllTick API,通过WebSocket协议接收并展示实时市场…...

数据结构 C/C++(实验一:线性表)

(大家好,今天分享的是数据结构的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 提要:实验题目 一、实验目的 二、实验内容及要求 三、算法思想 实验1 实验2 四、源程序及注释 …...

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦!🤩 基本配置 打包工具:Vite 前端框架:ElementPlus 开发语言:Vue3、TypeScript、Sass 代码检查:ESLint、Prettier IDE&#xf…...

Linux高阶——1103——Signal信号机制

1、信号机制 在linux和unix系统下,如果想要处置(挂起,结束)进程,可以使用信号,经典消息机制,所以进程包括系统进程都是利用信号处置进程的 kill -l——查看所有系统支持的信号 1-31号信号——Unix经典信号&#xff…...

如何编写STM32的定时器程序

编写STM32的定时器程序通常涉及以下步骤: 1. 选择定时器和时钟配置 首先,你需要选择一个可用的定时器(TIM),并配置其时钟源。时钟源可以是内部时钟或外部时钟,通常通过RCC(Reset and Clock Con…...

【C++】C++的单例模式、跟踪内存分配的简单方法

二十四、C的单例模式、跟踪内存分配的简单方法 1、C的单例模式 本小标题不是讨论C的语言特性,而是一种设计模式,用于确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个实例。即C的单例模式。这种模式常用于资源管理&…...

构建一个导航栏web

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}#menu{background-color:purple;width: 100px;height: 50px;}.item{float: left;/* 浮动标签可以让块标签&#xff0c…...

【Linux】Linux安全与密钥登录指南

在使用Linux服务器时&#xff0c;确保服务器的安全至关重要。本文将为你介绍一些关键的Linux安全措施&#xff0c;包括开启密钥登录、查看登录日志、限制登录IP以及查看系统中能够登录的账号。以下内容适合小白用户&#xff0c;通过简单的操作就能有效提升服务器的安全性。 目录…...

数据采集之scrapy框架

本博文使用基本框架完成搜房网或者其他网站的数据爬取&#xff08;重点理解 scrapy 框架的构建过程&#xff0c;使用回调函数&#xff0c;完成数据采集和数据处理&#xff09; 包结构目录如下图所示&#xff1a; 主要代码&#xff1a; &#xff08;sfw.py&#xff09; # -*- …...

ReactPress—基于React的免费开源博客CMS内容管理系统

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;感谢Star。 ![ReactPress](https://i-blog.csdnimg.cn/direct/0720f155edaa4eadba796f4d96d394d7.png#pic_center ReactPress 是使用React开发的开源发布平台&…...

Android 解决飞行模式下功耗高,起伏波动大的问题

根据现象抓log如下&#xff1a; 10-31 15:26:16.149066 940 3576 I android.hardware.usb1.2-service-mediatekv2: uevent_event change/devices/platform/soc/10026000.pwrap/10026000.pwrap:mt6366/mt6358-gauge/power_supply/battery 10-31 15:26:16.149245 940 3576 …...

2024第三次随堂测验参考答案

7-1 求一组数组中的平均数 输入10个整数&#xff0c;输出这10个整数的的平均数&#xff0c;要求输出的平均数保留2位小数 输入样例&#xff1a; 1 2 3 4 5 6 7 8 9 10 输出样例&#xff1a; 5.50 参考答案&#xff1a; #include <stdio.h> int main(){int sum 0;…...

期权交易策略 v0.1

一.概述 1.参考 <期权波动率与定价> 2.期权价格 标的现价100元,到期日价格可能情况如下。 价格 80 90 100 110 120 概率 20% 20% 20% 20% 20% 持有标的时,期望收益为0.如果持有100的看涨期权&#xff0c;忽略期权费&#xff0c;期望收益为(100-100)*0.2…...

pytorch学习:矩阵分解:奇异值分解(SVD分解)

前言 矩阵分解&#xff08;Matrix Decomposition&#xff09;是将一个矩阵分解成多个矩阵的乘积的过程&#xff0c;这种分解方法在计算、机器学习和线性代数中有广泛应用。不同的分解方式可以简化计算、揭示矩阵的内在结构或提高算法的效率。 奇异值分解 奇异值分解&#xf…...

接口测试用例设计的关键步骤与技巧解析!

简介 接口测试在需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法&#xff0c;和测试流程与理论章节的功能测试用例设计的方法类似&#xff0c;设计过程中还需要增加与接口特…...

CSS画icon图标系列(一)

目录 前言&#xff1a; 一、向右箭头 1.原理&#xff1a; 2.代码实现 3.结果展示&#xff1a; 二、钟表 1.原理&#xff1a; 2.代码展示&#xff1a; 3.最终效果&#xff1a; 三、小手机 1.原理&#xff1a; 2.代码展示&#xff1a; 3.最后效果&#xff1a; 四、结…...

【数据结构-合法括号字符串】【华为笔试题】力扣1190. 反转每对括号间的子串

给出一个字符串 s&#xff08;仅含有小写英文字母和括号&#xff09;。 请你按照从括号内到外的顺序&#xff0c;逐层反转每对匹配括号中的字符串&#xff0c;并返回最终的结果。 注意&#xff0c;您的结果中 不应 包含任何括号。 示例 1&#xff1a; 输入&#xff1a;s “…...

qt QFileInfo详解

1、概述 QFileInfo是Qt框架中用于获取文件信息的工具类。它提供了与操作系统无关的文件属性&#xff0c;如文件的名称、位置&#xff08;路径&#xff09;、访问权限、类型&#xff08;是否为目录或符号链接&#xff09;等。此外&#xff0c;QFileInfo还可以获取文件的大小、创…...

金华迪加 现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现

0x01 产品简介 金华迪加现场大屏互动系统是一种集成了先进技术和创意设计的互动展示解决方案,旨在通过大屏幕和多种交互方式,为观众提供沉浸式的互动体验。该系统广泛应用于各类活动、展览、会议等场合,能够显著提升现场氛围和参与者的体验感。 0x02 漏洞概述 金华迪加 现…...

手把手教你用XCVU3P和FMC+接口搭建高性能PCIe载板(附原理图下载)

基于XCVU3P与FMC的高性能PCIe载板开发实战指南 在当今高速数据处理领域&#xff0c;FPGA因其并行计算能力和可重构特性成为关键器件。Xilinx UltraScale系列的XCVU3P芯片配合FMC扩展接口&#xff0c;为开发者提供了强大的硬件加速平台。本文将深入解析如何从零开始构建一个支持…...

全能B站资源管理工具:BiliTools让视频下载与管理效率提升90%

全能B站资源管理工具&#xff1a;BiliTools让视频下载与管理效率提升90% 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bili…...

Qt实战:用QCustomPlot的QCPColorMap绘制声呐/热力图,附完整代码与色条(QCPColorScale)美化技巧

Qt实战&#xff1a;用QCustomPlot实现专业级声呐热力图可视化 第一次在项目中尝试用QCustomPlot绘制声呐数据时&#xff0c;我被它强大的性能震撼了——5000100的数据矩阵渲染仅需200毫秒&#xff0c;而Matplotlib处理同样规模的数据需要近3秒。这个发现让我彻底放弃了Python方…...

新手福音:免安装claude code,在快马平台开启你的ai编程第一课

作为一个刚接触编程的新手&#xff0c;最近想尝试用AI辅助写代码&#xff0c;但光是安装本地工具就让我头疼不已。直到发现了InsCode(快马)平台&#xff0c;才发现原来AI编程可以这么简单——不用配环境、不用解决依赖冲突&#xff0c;打开网页就能直接开玩。今天就把我的入门体…...

Path of Building:流放之路玩家必备的终极Build规划神器

Path of Building&#xff1a;流放之路玩家必备的终极Build规划神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 如果你正在玩《流放之路》并为复杂的Build规划感到头…...

PingFangSC 字体技术深度解析:现代Web字体架构实践指南

PingFangSC 字体技术深度解析&#xff1a;现代Web字体架构实践指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC PingFangSC&#xff08;苹方-简&#…...

P15801 [GESP202603 六级] 完全二叉树

[GESP202603 六级] 完全二叉树 https://www.bilibili.com/video/BV1jQAEz3Eir/ 1.4满二叉树与完全二叉树 https://www.bilibili.com/video/BV1T44y1P7Xx/ 数据结构合集 - 二叉树&完全二叉树(定义, 性质) https://www.bilibili.com/video/BV1eQ3RzxEoS/ 202603GESP六级C第2题…...

解锁自定义键盘体验:用Vial-QMK打造个性化配置指南

解锁自定义键盘体验&#xff1a;用Vial-QMK打造个性化配置指南 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk 核心价值&#xff1a;为什么选择Vial-QMK定制键盘&#xff1f; 在机械键盘的世…...

SELF-REFINE in Action: Enhancing LLM Outputs Through Iterative Self-Feedback

1. 什么是SELF-REFINE&#xff1f;为什么LLM需要自我迭代&#xff1f; 想象一下你正在写一封重要邮件。第一稿可能直接了当但缺乏礼貌&#xff0c;经过几次修改后&#xff0c;措辞变得更加得体。这就是人类通过自我反馈不断完善的过程。现在&#xff0c;大型语言模型&#xff0…...

Java全栈工程师的实战面试:从技术细节到业务场景

Java全栈工程师的实战面试&#xff1a;从技术细节到业务场景 一、面试开始 面试官&#xff08;微笑着&#xff09;&#xff1a;你好&#xff0c;很高兴见到你。我是负责技术面试的张工&#xff0c;今天我们会聊一些技术相关的问题。首先&#xff0c;请简单介绍一下你自己。 应聘…...