Gradle 使用技巧(四) - 如何定位和解决依赖冲突
1. 前言
随着业务的复杂度加深,我们免不了要引入许多的第三方开源库,也不可避免的会出现依赖冲突的错误。最常见的是V7、V4包之间的冲突。
2. 如何定位依赖冲突
解决依赖冲突很简单,难得是如何去定位是引入的哪个库导致的依赖冲突。
如果只想看结果的可以直接跳到最后。
2.1. 排除法
排除法很简单,但是很耗时,就是选择一个依赖一个依赖的注释、编译、看结果。当然这也是最傻的办法,我们开发者怎么能做这种繁琐的工作呢?(说得我好像我自己没做过似的。。)
2.2. Gradle Task
Android Studio虽然给我们提供了一个依赖树,但也只是一个总的平面图,并不是十分的直观。
External Libraries只给我们提供了一个依赖结果,并没有指出是哪个依赖依赖了什么东西。
所幸,Gradle提供了一个task:androidDependencies,这个task能在命令行中显示依赖树之间的依赖关系。
找到androidDependencies task,每一个module下面都有相应的androidDependencies。
双击执行后就能在命令行中打印相关的依赖信息了,这里为了演示,我新建了一个项目。
如上图,可以看到不同的buildType的所有信息都打印出来了,比如release:
release releaseCompileClasspath - Dependencies for compilation +--- com.android.support:appcompat-v7:26.1.0@aar +--- com.android.support.constraint:constraint-layout:1.1.2@aar +--- com.android.support:animated-vector-drawable:26.1.0@aar +--- com.android.support:support-vector-drawable:26.1.0@aar +--- com.android.support:support-v4:26.1.0@aar +--- com.android.support:support-media-compat:26.1.0@aar +--- com.android.support:support-fragment:26.1.0@aar +--- com.android.support:support-core-utils:26.1.0@aar +--- com.android.support:support-core-ui:26.1.0@aar +--- com.android.support:support-compat:26.1.0@aar +--- com.android.support:support-annotations:26.1.0@jar +--- com.android.support.constraint:constraint-layout-solver:1.1.2@jar +--- android.arch.lifecycle:runtime:1.0.0@aar +--- android.arch.lifecycle:common:1.0.0@jar \--- android.arch.core:common:1.0.0@jar
当然,这只是一个刚刚新增的项目,信息才这么少,如果是维护很久了的项目,那么信息将会让人眼花。
我们可以改为用命令行的方式打印信息,还可以进行相关的配置,配置的方法为:-q --configuration 依赖类型,如下就是打印implementation类型的依赖
./gradlew app:dependencies -q --configuration implementation
可以看到,结果明显精简了很多
但是,我们仍然看不出什么东西是吧?所以,请看下一步
2.3. 引入插件
前面说了,作为一个开发者,怎么能做那么多繁琐的事情呢?所以这里有个插(wu)件(qi)。
可以直接通过面板的形式看到是哪个依赖库,具体是冲突了哪个版本。
该插件的适应方式比较简单,就不多讲了。
3. 如何解决冲突
3.1. jar包冲突
这是最简单的,删除其中一个jar包。
3.2. 在明确的知道是哪个库的哪些依赖的情况下
可以使用exclude来去除传递依赖,如下:
3.2.1 exclude group
根据包名来过滤,下面的配置是:过滤包名"com.android.support"的所有依赖
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support' })
3.2.2 exclude module
根据模块名称来过滤下面的配置是过滤"support-annotations"这个模块
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude module: 'support-annotations' })
3.3. 不知道是哪个库的传递依赖导致冲突
这种情况最常见,我不想去找,也不想去逐个排除,那么就有以下两种方案:
3.3.1 一劳永逸法
直接统一指定transitive,就是为给dependencies配置transitive为false,这样就会以你当前依赖的版本为准。但是最好不要使用这种方式。
... configurations.all { transitive = false } ... dependencies{ }
需要注意的是configurations和android、dependencies节点是处于同一级的。
3.3.2 逐个指定
哪个冲突指定哪个。具体可以查看我另外一篇文章Gradle之强制依赖某个第三方库
configurations.all { resolutionStrategy.force "com.android.support:appcompat-v7:22.2.1" }
最后
未完待续、敬请期待!
免为其难的关注一下公众号吧!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
非零基础入门微信小程序
最近在学习微信小程序,极客人总结了一些入门经验,希望能帮助想学习小程序的同学提供参考 一、微信小程序的文件结构: pages/ : 页面文件,小程序由一个个page(类比于Activity或者ReactJS里面的页面组件)组成 utils/ : 放一些工具方法 .app.js: 小程序启动,类比于Android的Application类或者MainActivity app.json :小程序的全局配置文件, 类比于Android的清单文件,声明了小程序有哪些page app.wxss :全局的css样式文件 project.config.json :项目配置文件,定义了项目的名称,基础库版本,appId等 微信小程序 小程序由一个page组成,类比于Android的Activity,与其他组件化应用一样有生命周期,除此之外,小程序开发和ReactJS很像,比如React里面利用state管理界面数据,小程序有一个几乎和这一模一样的,叫data.小程序组件的生命周期 onLaunch Function 生命周期函数–监听小程序初始化 当小程序初始化完成时,会触发 onLaunch(全局只...
- 下一篇
在Windows笔记本上调试运行在iOS设备上的前端应用
我在每天工作中需要在不同的移动设备上测试我们开发的前端应用是否正常工作,比如iOS设备和Android设备。我用的工作笔记本电脑又是Lenovo的,安装的是Windows操作系统。 有的时候一个开发好的前端应用,在Android设备上正常工作,但是在iOS平板上测试却发现问题(相当广大前端开发者都曾经遇到过类似问题)。顺手就想调试一下找到原因。那么一个前端应用运行在iOS设备上,程序员如何在安装了Windows系统的笔记本上进行调试呢? 假设我的前端应用是这个url:https://jerrylist.cfapps.eu10.hana.ondemand.com/ui5/。 在IPAD上打开界面如下: 1. 在Windows笔记本电脑上安装iTunes: https://www.apple.com/cn/itunes/download/ 安装后,您的Windows笔记本电脑才能成功和iOS设备连接并成功识别它。 2. 到iOS设备上,菜单iPad->Settings->Safari->Advanced,打开“Web Inspector” 选项。 3. 从github网站...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品