如何解決 Android Studio 上遠程依賴包重復的問題(com.android.dex.DexException)
你們是不是會經常遇到這樣的一個錯誤:com.android.dex.DexException: Multiple dex files define XXXX,一般情況下,是我們項目中引用了重復的庫或者jar包引起的,我們找到去掉即可解決,但是如果你遠程依賴的兩個庫里,同時引用了同一個庫,你該怎么解決呢?把那兩個庫都下載下來,自己修改?去掉,再本地引入嗎?今天告訴你們一個簡單的方法。
說實話,隨著現在輪子越來越多,而且很多人都樂于分享和封裝一些控件或者開源的庫,來共享給大家一起使用。但是經常很多的人封裝都在自己庫里引起很多其他的第三方庫,這就不免有時會發生你引用的兩個庫都同時引用了同一個第三方庫,最坑人的就是他們封裝的開源庫里使用的都是直接引用,而不是使用 Provided 的方式暴露給你,而是自己直接用了。
我知道有很多人都用強迫癥,在使用遠程依賴慣了以后,不習慣本地導入的,感覺不舒服了。所以難免就得想辦法解決這個問題。
舉個例子:
比如:你在使用了一個能生成你符合需求二維碼的庫,而這個庫在內容引用了zxing。但是這里面的掃一掃界面并不好看,你發現了另外一個庫里的掃一掃,正好符合你的需求,所以你就在掃一掃這個功能上用了另外一個庫,但是這個庫也引用了zxing。
當然了,我只是舉了一個極端的例子,不會經常發生如上的例子,但是這個錯誤確實很常見。
如果,就像例子中那樣做,你去編譯運行項目時,這時,你就會看到一個錯誤,大約如下意思:
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;
重點看這個錯誤:
com.android.dex.DexException
這就說明你引用的庫或者jar包有重復的地方,所以,這時,你就需要從你引用的遠程依賴或者jar中找到重復的,去刪掉一個就可以解決了。
是不是很簡單,這是在你控制的前提下,如果就像我剛才舉得例子一樣,如果你遠程依賴的兩個庫,不是本地的哈,同時引用同一個第三方,那該怎么解決呢?
再舉個例子:
compile('com.loonggg.saoyisao.lib:1.1.0')
compile('com.timmy.qrcode.lib:1.4.1') {
exclude group: 'com.google.zxing'
}
com.loonggg.saoyisao.lib:1.1.0 這個依賴里引用了第三方zxing。
com.timmy.qrcode.lib:1.4.1這個依賴里也引用了zxing這個庫,在com.timmy.qrcode.lib:1.4.1的依賴里添加語句 exclude group: ‘com.google.zxing’,意思是編譯的時候將group為com.google.zxing的所有library都去除在外,這樣com.timmy.qrcode.lib:1.4.1就會自動去引用com.loonggg.saoyisao.lib:1.1.0項目里的zxing依賴了。這樣問題就解決了。
但是,到這里我們就需要注意一點:這個exclude group: ‘xxx.xxx.xxx’的方法,只能去除遠程依賴的庫,如果是你引用的兩個遠程依賴庫A和B,A中是本地依賴的zxing.jar,而B中也是本地依賴的zxing.jar包,那就無解了,只能把A和B這兩個庫,下載下來自己去修改了,去掉了。當然,如果你項目中同時遠程依賴的A和B這兩個庫,又都重復遠程依賴了同一個庫,那解決方法跟我上面說的就好解決了。如果一個是遠程依賴,一個是本地引用jar包的方式,那也好解決,在遠程依賴的那個庫,你引用的時候,通過exclude group: ‘xxx.xxx.xxx’的方式就能夠解決了。
來自:http://godcoder.me/2017/05/10/如何解決 Android Studio 上遠程依賴包重復的問題/