1. 程式人生 > >Gradle解決依賴衝突

Gradle解決依賴衝突

問題描述

  有時候專案依賴的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-v423.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的版本。