一、问题描述
今天在编写代码过程中,引入了一个组内新的封装库,导致编译冲突。如下所示:
这是一个最常见的问题无法合并,遇到这个问题不要慌,我们打开logcat 里面的gradle consonle
滑到最下面双击我们的Run with --stacktrace
然后我们可以看到很多的红字也就是报错的
告诉我因为 Multiple dex files define Landroid/support/v4/app/TaskStackBuilder$SupportParentable;
有多个 相同的 TaskStackBuilder 类导致编译不了的。
其他的support包都是27.1.1,这个support-v4-23.2.1,从哪里来的?
我们代码的build.gradle文件中,都搜索不到23.2.1 是从哪里来的。我的代码中根本就没有地方引用这个版本的support-v4-23.2.1,那么我们该如何查找这个这个版本的support-v4-23.2.1到底是在哪里引入的呢???
二、如何快速查看Gradle项目包依赖情况?
通过上面的问题,我们想查找这个这个版本的support-v4-23.2.1到底是在哪里引入的,就必须得把项目的gradle依赖树的情况获知,如何获知android项目的gradle依赖呢??可以通过以下几种方式来获知。
2.1 执行命令 ./gradlew 模块名:dependencies
比如我的项目是 demo工程编译失败的,所以我们执行命令
gradlew :demo:dependencies
执行命令之后的输出日志如下所示,因为日志太多,截取部分:
+--- com.xtc.data:data-new-sqlcipher:1.0.2
| +--- net.zetetic:android-database-sqlcipher:3.5.7
| \--- com.j256.ormlite:ormlite-core:4.48
\--- com.xtc.phone:data-phone:1.1.8
+--- com.android.support:appcompat-v7:27.1.1 (*)
+--- com.android.support:support-annotations:27.1.1
+--- io.reactivex:rxandroid:1.2.1 (*)
+--- com.facebook.fresco:fresco:0.12.0
| +--- com.facebook.fresco:drawee:0.12.0
| | +--- com.android.support:support-v4:23.2.1
| | | \--- com.android.support:support-annotations:23.2.1 -> 27.1.1
| | \--- com.facebook.fresco:fbcore:0.12.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:imagepipeline:0.12.0
| +--- com.android.support:support-v4:23.2.1 (*)
| +--- com.facebook.fresco:imagepipeline-base:0.12.0
| | +--- com.android.support:support-v4:23.2.1 (*)
| | +--- com.parse.bolts:bolts-tasks:1.4.0
| | +--- com.nineoldandroids:library:2.4.0
| | \--- com.facebook.fresco:fbcore:0.12.0
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.nineoldandroids:library:2.4.0
| \--- com.facebook.fresco:fbcore:0.12.0
+--- com.facebook.fresco:animated-gif:0.12.0
| +--- com.android.support:support-v4:23.2.1 (*)
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:animated-base:0.12.0
| +--- com.android.support:support-v4:23.2.1 (*)
| +--- com.facebook.fresco:imagepipeline-base:0.12.0 (*)
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:imagepipeline:0.12.0 (*)
\--- com.facebook.fresco:imagepipeline-okhttp3:0.12.0
+--- com.squareup.okhttp3:okhttp:3.0.1 -> 3.4.1 (*)
+--- com.facebook.fresco:fbcore:0.12.0
\--- com.facebook.fresco:imagepipeline:0.12.0 (*)
由上面的依赖树我们可以看出来,
com.android.support:support-v4:23.2.1 被 com.facebook.fresco:fresco:0.12.0、com.facebook.fresco:animated-gif:0.12.0引用了。而这两个库又被com.xtc.phone:data-phone:1.1.8引用了。
所以我们在引用com.xtc.phone:data-phone:1.1.8的地方,将com.android.support:support-v4:23.2.1exclude掉即可正常编译。如下所示:
将
implementation libraries.data_phone
修改为以下即可。
//implementation libraries.data_phone
//data_phone里面的fresco包含了com.android.support:support-v4:23.2.1
implementation (libraries.data_phone){
exclude group: 'com.android.support', module: 'support-v4'
}
如果是直接依赖本地的project的话,也是可以进行exclude,只是需要在project 外面再包一层,写成如下所示:
从
implementation project(':phone')
改为
//data_phone里面的fresco包含了com.android.support:support-v4:23.2.1
implementation (project(':phone')){
exclude group: 'com.android.support', module: 'support-v4'
}
重新编译,查看下依赖关系。
\--- com.xtc.phone:data-phone:1.1.8
+--- com.android.support:appcompat-v7:27.1.1 (*)
+--- com.android.support:support-annotations:27.1.1
+--- io.reactivex:rxandroid:1.2.1 (*)
+--- com.facebook.fresco:fresco:0.12.0
| +--- com.facebook.fresco:drawee:0.12.0
| | \--- com.facebook.fresco:fbcore:0.12.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:imagepipeline:0.12.0
| +--- com.facebook.fresco:imagepipeline-base:0.12.0
| | +--- com.parse.bolts:bolts-tasks:1.4.0
| | +--- com.nineoldandroids:library:2.4.0
| | \--- com.facebook.fresco:fbcore:0.12.0
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.nineoldandroids:library:2.4.0
| \--- com.facebook.fresco:fbcore:0.12.0
+--- com.facebook.fresco:animated-gif:0.12.0
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:animated-base:0.12.0
| +--- com.facebook.fresco:imagepipeline-base:0.12.0 (*)
| +--- com.parse.bolts:bolts-tasks:1.4.0
| +--- com.facebook.fresco:fbcore:0.12.0
| \--- com.facebook.fresco:imagepipeline:0.12.0 (*)
\--- com.facebook.fresco:imagepipeline-okhttp3:0.12.0
+--- com.squareup.okhttp3:okhttp:3.0.1 -> 3.4.1 (*)
+--- com.facebook.fresco:fbcore:0.12.0
\--- com.facebook.fresco:imagepipeline:0.12.0 (*)
移除了重复类之后,正常编译。
2.2 通过Android Studio右侧的Gradle面板上的dependencies命令
如果上面的命令方式你不习惯,你可以通过Android Studio右侧的Gradle面板上的dependencies命令执行,如下所示
如上图,找到【 demo】工程,展开,然后找到【help】目录,找到【dependencies】命令,点击即可执行命令。如下所示
2.3 执行 gradlew build --scan 命令,生成
如果你嫌在命令行窗口展示观看不友好,这里还有一种体验更好的方式。
输入下面命令行:gradlew build --scan
编译完成的时候,出现输入框,提示我们输入 yes或者no
Do you accept the Gradle Cloud Services license agreement (https://gradle.com/terms-of-service)? [yes, no]
我们输入yes,然后继续
Do you accept the Gradle Cloud Services license agreement (https://gradle.com/terms-of-service)? [yes, no]
yes
Gradle Cloud Services license agreement accepted.
Publishing build scan...
https://gradle.com/s/paiitjk7aaiqa
C:\CodeForAndroid\BigData>
我们打开上面生成的链接: https://gradle.com/s/paiitjk7aaiqa,然后登陆网站即可。
登陆网站,然后查看具体的信息,如下所示:
登陆邮箱,查看刚才收到的邮件,如下所示:
2.4 通过 gradle view 插件查看gradle依赖树
如下图所示,在Settings --> Plugins中,搜索 gradle view插件并安装,下图是我已经安装好的截图。
搜索不到的,可以直接去 http://plugins.jetbrains.com 网站搜索,然后下载
http://plugins.jetbrains.com/plugin/7150-gradle-view 下载,如下所示
第一次安装完后,需要重启Android Studio ,重启之后我们来使用gradle view 插件
如上图,找到View–>Tools Windows-Gradle View ,然后点击即可执行。
三 总结
上面我介绍了四种查看Gradle项目依赖树的情况的方法,你们可以自己选择自己喜欢的。个人觉得插件还是最好用的