问题描述
有时候项目依赖的com.android.support:support-v4的版本会遇到和其他依赖库中com.android.support:support-v4的版本发生冲突的情况。例如我项目中使用的22.2.1版本,但是引入的最新的Fresco中依赖的是23的版本,由于Fragment的源码有变化导致之前的版本出现问题。这是由于默认情况下会优先高版本的依赖库。这种时候需要我们去手动排除依赖。
解决方案
检查依赖报告:
当你运行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依赖。
排除依赖:
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的版本。