你們是不是會經常遇到這樣的一個錯誤: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`的方式就能夠解決了。
歡迎大家關注我的技術分享公眾號:非著名程式設計師(smart_android)。技術文章均先首發於我的技術分享的微信公眾號。