Android三方依赖冲突Gradle中exclude的使用
作者:sunbinkang 发布时间:2023-05-05 05:09:56
一、场景
Android项目的开发过程中,我们项目中的gradle的dependencies闭包中会引入很多三方依赖库,引入的库越多,越容易产生库之间的依赖冲突。
列举冲突的场景:
1、同一个依赖库引入多个版本;
2、重复引入了同一个依赖库;
编译报错信息一般为:Program type already present
二、如何查看项目中的三方依赖?
方案一: Gradle task工具查看
按照如图目录找到dependencise双击,会在Run控制台输出打印。
结果如下:
方案二:Terminal控制台查看
在windows上Android studio Terminal中使用这个命令:
gradlew :app:dependencies
在MacOS中使用下面的命令:
gradlew :app:dependencies
其中的“app”为module名称。
这个命令会将gradle执行的各个步骤都打印出来,包括releaseUnitTestRuntimeClasspath,releaseUnitTestCompileClasspath,releaseRuntimeClasspath,releaseCompileClasspath,lintClassPath,debugUnitTestRuntimeClasspath等等,反正会打印很多很多。
这种就可以把依赖树都打印出来。因为存在这种依赖树的问题,所以很容易导致依赖冲突,因为你不知道别的依赖库有没有和另外一个依赖库引入的依赖库或者自己导入的依赖库发生了冲突。同一个依赖库版本不同很容易导致依赖冲突。
这时候我们就需要过滤一下(window):很多资料提示是(gradlew :app:dependencies --configuration compile,这种compile是以前的方式引入依赖,现在换成implementation)
gradlew :app:dependencies --configuration implementation
打印如下:
但不知道为啥这种不打印出来依赖树。
接下来我又试了一下下面这个过滤条件:
gradlew :app:dependencies --configuration releaseRuntimeClasspath
这样就可以打印出依赖树了:
这样对项目中的依赖就可以一目了然。然后ctrl + f 查找你认为有问题有冲突的依赖。
三、使用exclude解决依赖冲突的问题
1、以下面这个例子来示范:
这个cardview是material依赖库下的一个依赖。
这个是我在module app的MainActivity里面正常使用。
现在假如有另外一个依赖库中也包含了androidx.cardview这个依赖库包的其他版本,注意是也存在的其他版本,就会可能发生冲突。冲突造成的错误,后面遇到再贴出来。
2、那么我们要怎么解除这种依赖库引起的编译问题呢?
// implementation 'com.google.android.material:material:1.2.1'
implementation('com.google.android.material:material:1.2.1') {
exclude group: 'androidx.cardview', module: 'cardview'
}
现在我使用gradle中的exclude的关键字,来排除app.gradle文件中的这个cardview依赖库。
解释一下:exclude是groovy中的一个函数,group是要排除的包名,module是模块名。
用图说更清楚:
但正常情况下,写group也就行,不写module也行。
那么排除后的效果是什么?
排除之后,这个CardView就找不到了。这样就可以使用和这个冲突的另一个CardView的版本,就可以把Android中的依赖库冲突给解决了。(tips:我这里没演示出冲突的问题)
四、总结
上面是介绍了Android查看项目中使用到那些依赖库的几种方案,以及介绍了Android中使用exclude如何处理依赖库存在冲突的问题。当然解除依赖库冲突不止这一种方案,但这种我觉得是比较方便的一种。
来源:https://blog.csdn.net/sunbinkang/article/details/126055548


猜你喜欢
- 目录Spring是什么?Spring Boot是什么?Maven依赖项springboot为不同的Spring模块提供了许多启动程序依赖项。
- AutoCompleteTextView是一个具有自动补全功能的EditView,当用户输入数据后,AutoCompleteTextView
- 如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。下面考虑一个线程同步方面的问题。对于线程同步,Java类库提
- 一、项目简述功能:登录,门诊划价,收费,报表,药品管理等等功能。二、项目运行运行环境: Jdk1.8 + Tomcats . 5 + mys
- poi解析Excel文件版本问题解决办法poi解析Excel文件时有两种格式: HSSFWorkbook格式用来解析Excel2003(xl
- 背景2021年第一天早上,客户突然投诉说系统的一个功能出了问题,紧急排查后发现后端系统确实出了bug,原因为前端传输的JSON报文,后端反序
- 问题描述在使用poi-tl word模版工具时,发现生成的文档中,图片格式为嵌入型,有的图片甚至被表格遮挡一半。而自己想要的图片格式为上下型
- 项目概况:Spring Cloud搭的微服务,使用了eureka,FeignClient,现在遇到FeignClient调用接口时不支持上传
- 1.1、Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Inte
- 本文实例讲述了Android编程自定义组件。分享给大家供大家参考,具体如下:在Android中,所有的UI界面都是由View类和ViewGr
- 文章来源:csdn 作者:wangfengsdu经常听到回调函数(callback function)这个概念, 所谓回调函数,就是指这个函
- 由于ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告&
- 这篇文章主要介绍了简单了解Java多态向上转型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内
- 本猿今天今天帮公司写第三支付接口的时候,灵机一动就想写一个扩展性比较的强的充值接口,t通过选择不同的充值渠道,调用不同的充值实现类(好了,废
- 本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下此次扫雷中我们以9乘以9的表格为例,后期可自动调动主要思路:建立两
- UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于 * 的事件处理。对于基于 * 的
- public void add(intindex, Eelement)从index索引的位置添加element元素,后面的元素都往
- 今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用。理论:虚方法:用virtual修饰的方法叫
- 使用javafx更新UIJavaFx如果在子线程中更新UI,不论是task还是runable都会报错java.lang.IllegalSta