Gradle解决依赖冲突

作者: WayneLyn | 来源:发表于2016-05-18 17:50 被阅读13646次

    问题描述

    有时候项目依赖的com.android.support:support-v4的版本会遇到和其他依赖库中com.android.support:support-v4的版本发生冲突的情况。例如我项目中使用的22.2.1版本,但是引入的最新的Fresco中依赖的是23的版本,由于Fragment的源码有变化导致之前的版本出现问题。这是由于默认情况下会优先高版本的依赖库。这种时候需要我们去手动排除依赖。

    解决方案

    1. 检查依赖报告:
      当你运行dependencies任务时,这个依赖树会打印出来,依赖树显示了你build脚本声明的顶级依赖和它们的传递依赖:
      +--- project :photoAlbum
      | +--- com.android.support:support-v4:22.2.1 ->23.1.1
      | +--- com.actionbarsherlock:actionbarsherlock:4.4.0
      | +--- pl.droidsonroids.gif:android-gif-drawable:1.1.7
      | +--- com.qiniu:qiniu-android-sdk:7.0.6
      | | --- com.loopj.android:android-async-http:1.4.6 -> 1.4.7
      | +--- com.nostra13.universalimageloader:universal-image-loader:1.9.1
      | +--- com.loopj.android:android-async-http:1.4.7
      | +--- com.umeng.analytics:analytics:5.4.2
      | +--- com.facebook.fresco:fresco:0.10.0
      | | +--- com.facebook.fresco:drawee:0.10.0
      | | | --- com.android.support:support-v4:23.1.1()
      | | | | --- com.facebook.fresco:fbcore:0.10.0
      | | +--- com.facebook.fresco:fbcore:0.10.0
      | | --- com.facebook.fresco:imagepipeline:0.10.0
      | | +--- com.android.support:support-v4:23.1.1 (
      )
      | | +--- com.nineoldandroids:library:2.4.0
      | | +--- com.facebook.fresco:fbcore:0.10.0
      | | +--- com.facebook.fresco:imagepipeline-base:0.10.0
      | | | +--- com.nineoldandroids:library:2.4.0
      | | | +--- com.facebook.fresco:fbcore:0.10.0
      | | | --- com.parse.bolts:bolts-android:1.1.4
      | | --- com.parse.bolts:bolts-android:1.1.4
      这个是我项目中的一个module,顶级依赖中使用的是23.1.1。仔细观察你会发现有些传递依赖标注了*号,表示这个依赖被忽略了,这是因为其他顶级依赖中也依赖了这个传递的依赖,Gradle会自动分析下载最合适的依赖。有些依赖形如22.2.1 ->23.1.1是由于默认会优先版本高的依赖.这个时候你想使用版本低的依赖的话需要排除掉高的依赖。因此这里需要排除Fresco里面的supportV4依赖。
    2. 排除依赖:
      compile('com.facebook.fresco:fresco:0.10.0') {
      exclude module: 'support-v4'
      }
      重新sync一下,再打印出依赖树,发现结果如下:
      +--- project :photoAlbum
      | +--- com.android.support:support-v4:22.2.1 (*)
      | +--- com.actionbarsherlock:actionbarsherlock:4.4.0
      | +--- pl.droidsonroids.gif:android-gif-drawable:1.1.7
      | +--- com.qiniu:qiniu-android-sdk:7.0.6
      | | --- com.loopj.android:android-async-http:1.4.6 -> 1.4.7
      | +--- com.nostra13.universalimageloader:universal-image-loader:1.9.1
      | +--- com.loopj.android:android-async-http:1.4.7
      | +--- com.umeng.analytics:analytics:5.4.2
      | +--- com.facebook.fresco:fresco:0.10.0
      | | +--- com.facebook.fresco:drawee:0.10.0
      | | | --- com.facebook.fresco:fbcore:0.10.0
      | | +--- com.facebook.fresco:fbcore:0.10.0
      | | --- com.facebook.fresco:imagepipeline:0.10.0
      | | +--- com.nineoldandroids:library:2.4.0
      | | +--- com.facebook.fresco:fbcore:0.10.0
      | | +--- com.facebook.fresco:imagepipeline-base:0.10.0
      | | | +--- com.nineoldandroids:library:2.4.0
      | | | +--- com.facebook.fresco:fbcore:0.10.0
      | | | --- com.parse.bolts:bolts-android:1.1.4
      | | --- com.parse.bolts:bolts-android:1.1.4
      这样就发现成功排除掉了fresco中的supportV4包,转而使用顶级依赖中的22.2.1的版本。

    参考

    相关文章

      网友评论

      • happyyy2017:这个是查这个module依赖哪些,怎么查看一个module被哪些module依赖了?
      • 捡淑:楼主有没有遇到经常敲命令却不出任何反应的?以前遇到过,蛋疼。。。
      • ideawork:这个依赖树怎么打印出来的
        Victor_Xu:@baa0ac740b1f gradlew -q app:dependencies
        baa0ac740b1f:@WayneLyn 'gradle' 不是内部或外部命令,也不是可运行的程序
        或批处理文件。
        WayneLyn:@ideawork Android Studio中可以在Terminal终端面板里面输入gradle XXX:dependencies.
        XXX表示你想打印的module的name

      本文标题:Gradle解决依赖冲突

      本文链接:https://www.haomeiwen.com/subject/jnywrttx.html