1. 程式人生 > >Android專案依賴亂象之Gradle迴圈依賴

Android專案依賴亂象之Gradle迴圈依賴



這個問題在使用eclipse進行開發時就存在,只不過當時大部分引入的是jar包,直接檢查即可排除包重複的問題; 後來使用Android Studio進行開發,用上了gradle來管理專案的依賴,很方便,極大減少工作量,一句話即可引入; 然而,最近在檢視一個執行的專案時,無意間瞥見了這個:



完全懵圈了啊,為什麼呢 明明專案裡都統一指定了support庫的版本號為25.0.0,為什麼還是有25.2.0,更有甚者還有23.3.0,24.2.1,這都是什麼情況? 後來查了下,第三方庫也存在依賴庫,專案依賴的第三方庫越多,這種情況就越明顯,根本控制不了了嗎?錯錯錯,我們還是有辦法的,強大的gradle連這點東西都擺平不了,怎麼對得起那麼慢點構建速度呢—。—

下面我們分幾步來操作:

第一步:專案根目錄下執行命令:./gradlew :app:dependencies --configuration compile
命令解釋app:dependencies ## 列印所有依賴庫app:dependencies --configuration compile ## 列印編譯時的依賴庫app:dependencies --configuration runtime ## 列印執行時的依賴庫

dependency任務執行完會打印出這個:



也就是module-app 的依賴樹,顯示了專案的build指令碼宣告的頂級依賴和傳遞依賴;

意義: 版本:唯一的依賴。版本():還存在該庫其他版本的依賴或者間接依賴,並且預設選擇()所標註的版本。版本1->版本2():還存在該庫其他版本的依賴或者間接依賴,並且選擇 版本2。

第二步:使用exclude 排除依賴;

使用方法: compile (group: 'foo', name: 'foo', version: '0.1') { exclude group:'groupName' module:'modelName' }

舉例:compile('com.facebook.fresco:fresco:0.10.0') { exclude module: 'support-v4' } 最後,其實有更完善的思路

a. 利用傳遞依賴特性 -例如a.jar依賴b.jar,在Gradle中,只需新增a.jar即可,Gradle將自動把a依賴的所有庫全部下載。 或者可手動配置transitive屬性為false,阻止依賴的下載 dependencies { // transitive 屬性預設為 true compile group:'log4j',name:'log4j',version:'1.2.17',transitive:false -可能存在依賴傳遞的版本衝突問題,所以需要2中提到的 exclude,手動排除

為了解決Gradle衝突有以下幾種方式(1) 最近版本策略(預設):使用最新版本,gradle自動選擇;(2) 衝突失敗策略:發生衝突時,編譯失敗,需要手動配置(3) 強制指定版本策略:發生衝突時,提前指定版本

舉例如下:/* 衝突失敗策略設定*/ configurations.all { resolutionStrategy { failOnVersionConflict() } } /* 強制指定版本策略設定*/ dependencies { compile group:'b',name:'b',version:'1.1',force:true }

b. 使用動態依賴特性 需要手動配置,舉例如下:dependencies { /* 選擇1以上任意一個版本,這使發生版本衝突的機率變小*/ compile group:'b',name:'b',version:'1.+' /* 選擇最新的版本,避免直接指定版本號 */ compile group:'a',name:'a',version:'latest.integration' }

c.其他特性 指定庫檔案型別// ext 預設jar,可選屬性為war、zip compile group:'b',name:'b',version:'1.1',ext:'war'`` 使用分類器(classifiers) 替換傳遞依賴的版本compile group:'a',name:'a',version:'l.0' { dependencies 'b.b:1.1' }

c.統一配置方式: configurations.all{ // transitive=false // 強制指定版本 resolutionStrategy{ force'org.hamcrest:hamcrest-core:1.3' // 強制不編譯 all*.excludegroup:'org.hamcrest',module:'hamcrest-core' 一定要注意的是,不同版本的庫可能會導致錯誤,上述配置一定要仔細檢查,確保不會出現錯誤。