1. 程式人生 > >Android Studio的Gradle新增重複依賴的問題

Android Studio的Gradle新增重複依賴的問題

Multiple dex files define Lcom/nineoldandroids/animation/Animator$AnimatorListener; 在Android Studio裡build專案時不會報錯,但是run專案的時候就會報上面的那個錯誤。這個問題糾結了我整整一天啊,雖然最終的確是解決了,然而到現在我還是沒能完全弄懂原理。記錄一下我解決這個問題的過程。

首先,遇到這個問題的時候,意料之外,情理之中。因為在用eclipse寫Android的時候,也遇到過同樣的問題,我知道是重複引用包的問題。當時將自己開發的專案裡libs資料夾重複的jar包刪掉就行,會自動引用library專案裡的jar包。順著這個思路,我將gradle檔案裡的compile ‘com.nineoldandroids.library:2.4.0’註釋掉,然而並沒有什麼用。

然後,我思考了一下,覺得應該是其他依賴裡也引用了nineoldandroids,可是這我就沒辦法了呀,這是通過gradle自動下載配置的呀。然後我就百度(再再再次強調,搜這種技術上的問題時,千千萬萬記得用Google,這次就又栽坑裡了)了一下,大部分都是些重複的資料,或者是沒人回覆的求助資訊。說來也慚愧,自己也沒能幫助做些什麼,希望篇博文能幫助到大家。

最後我去加入的幾個Android學習交流群去提問。有人提示我說他也遇到過這個問題,他是將依賴的專案下載下來,作為module來引入到自己的專案裡。我也將引用了nineoldandroids的那個專案下載下來這樣去做,可是還是報錯。實在是沒辦法了,採用終極辦法,就是將依賴的那個專案原始碼和res檔案直接copy到自己的專案裡。好了,世界終於清靜了,可是這種曲線救國的行為實在是很差的一種解決方式。不僅擾亂了自己的專案結構,也是治標不治本,假如下次又遇到這種問題,不是又得把原始碼貼上複製過來?

第二天,接著寫專案,實在是忍不了那雜亂的包,一定要解決這個問題才肯罷休!這次我翻過了那道牆,用了google來搜尋這個問題。終於讓我找到了解決方式。

compile('com.mxn.soul:flowingdrawer-core:1.2.0')
compile('com.rengwuxian.materialedittext:library:2.1.4') {
        exclude group: 'com.nineoldandroids'
}

flowingdrawer-core這個依賴裡的libs資料夾下有nineoldandroids2.4.0.jar這個jar包。
materialedittext這個依賴裡的gradle裡compile ‘com.nineoldandroids.library:2.4.0’
所以會導致重複引用了jar包。在materialedittext的依賴裡新增語句 exclude group: ‘com.nineoldandroids’,意思是編譯的時候將group為com.nineoldandroids的所有library都去除在外,這樣materialedittext就會自動去引用flowingdrawer-core專案裡的nineoldandroids2.4.0.jar包了。到此問題解決了。

不過,我又進行了其他的嘗試,我改成如下配置

compile('com.mxn.soul:flowingdrawer-core:1.2.0'){
       exclude group: 'com.nineoldandroids'
}
compile('com.rengwuxian.materialedittext:library:2.1.4') 

這樣還是會出問題。想了想,應該是exclude語句只能在編譯時將gradle檔案裡的依賴去除掉,而不能去掉libs檔案裡的jar包引用。