Gradle 使用技巧(四) - 如何定位和解决依赖冲突

简介: 1. 前言随着业务的复杂度加深,我们免不了要引入许多的第三方开源库,也不可避免的会出现依赖冲突的错误。最常见的是V7、V4包之间的冲突。2. 如何定位依赖冲突解决依赖冲突很简单,难得是如何去定位是引入的哪个库导致的依赖冲突。

1. 前言

随着业务的复杂度加深,我们免不了要引入许多的第三方开源库,也不可避免的会出现依赖冲突的错误。最常见的是V7、V4包之间的冲突。

2. 如何定位依赖冲突

解决依赖冲突很简单,难得是如何去定位是引入的哪个库导致的依赖冲突。
如果只想看结果的可以直接跳到最后。

2.1. 排除法

排除法很简单,但是很耗时,就是选择一个依赖一个依赖的注释、编译、看结果。当然这也是最傻的办法,我们开发者怎么能做这种繁琐的工作呢?(说得我好像我自己没做过似的。。
img_bc28b2138a23db011ace4fb12d0aa921.png
滑稽

)

2.2. Gradle Task

Android Studio虽然给我们提供了一个依赖树,但也只是一个总的平面图,并不是十分的直观。

img_c70e0a3032e9c7c892069347605729bf.png
Android Studio依赖树

External Libraries只给我们提供了一个依赖结果,并没有指出是哪个依赖依赖了什么东西。

所幸,Gradle提供了一个task:androidDependencies,这个task能在命令行中显示依赖树之间的依赖关系。

找到androidDependencies task,每一个module下面都有相应的androidDependencies。

img_92c534ca99a2eedce8a7d50a94f12a5c.png
task位置

双击执行后就能在命令行中打印相关的依赖信息了,这里为了演示,我新建了一个项目。

img_54aca0e97412141f7710c2fcd5af5136.png
命令行执行结果

如上图,可以看到不同的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

可以看到,结果明显精简了很多

img_5f3c84a15d3c9166ff3fd48944654b56.png
执行结果

但是,我们仍然看不出什么东西是吧?所以,请看下一步

2.3. 引入插件

前面说了,作为一个开发者,怎么能做那么多繁琐的事情呢?所以这里有个插(wu)件(qi)

可以直接通过面板的形式看到是哪个依赖库,具体是冲突了哪个版本。

img_55c59e9ceb975edbf823e04ad7cc699d.png
插件截图

该插件的适应方式比较简单,就不多讲了。

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"
}
img_44dd16ef624f0dfa3abc277d8eed6b3b.png
指定依赖

最后

未完待续、敬请期待!
免为其难的关注一下公众号吧!!

img_f0790f8ed7e67ea3b5a4d6bc3f65b0aa.png
生活实在是太苦啦
img_b246dc41a34e6fdd3598d113e0f65194.jpe
FullScreenDeveloper
目录
相关文章
|
6月前
|
安全 Cloud Native Go
解决Gradle依赖问题:不安全协议的处理策略Could not resolve all dependencies for configuration ‘:detachedConfiguration9
解决Gradle依赖问题:不安全协议的处理策略Could not resolve all dependencies for configuration ‘:detachedConfiguration9
233 0
|
JavaScript Java Maven
|
Java Android开发
Android如何通过Gradle发布Android依赖库(aar)到 jitpack 公共仓库
Android如何通过Gradle发布Android依赖库(aar)到 jitpack 公共仓库
478 0
|
Java API Android开发
Gradle 依赖关系中 compile和 implementation的区别
将在一个项目中展示implementation,api以及compile之间的差异。 假设我有一个包含三个Gradle模块的项目: • app(Android应用) • my-android-library(Android库) • my-java-library(Java库) app具有my-android-library与依赖。my-android-library具有my-java-library依赖。
504 0
|
Java Spring
一行解决IDEA中gradle下载依赖jar包慢问题(适用于各操作系统)
一行解决IDEA中gradle下载依赖jar包慢问题(适用于各操作系统)
820 0
一行解决IDEA中gradle下载依赖jar包慢问题(适用于各操作系统)
|
4月前
|
Java 关系型数据库 MySQL
Gradle中的依赖Dependencies说明与使用总结
Gradle中的依赖Dependencies说明与使用总结
102 0
|
5月前
|
Java Maven Android开发
android之gradle配置仓库与引入依赖
android之gradle配置仓库与引入依赖
229 0
|
5月前
gradle依赖冲突的解决方式
gradle依赖冲突的解决方式
|
6月前
|
Java 数据库连接 API
Gradle依赖管理:编译时和运行时依赖的区别
Gradle依赖管理:编译时和运行时依赖的区别
42 0
|
9月前
|
缓存 数据可视化 Java
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?
Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等。可见,要成为 Android 高级工程师 Gradle 是必须掌握的知识点。
120 0
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?