1. 程式人生 > >Android Studio 中多個module引用同一個jar(或者衝突解決)解決方案

Android Studio 中多個module引用同一個jar(或者衝突解決)解決方案

在Android開發過程中我們多多少少會引入module,不僅會提高專案的開發進度,而且專案管理起來相當方便。

但是同一個專案中引入多個module引入同一個jar或有衝突的jar時候在編譯的時候會出現錯誤,這些錯誤往往讓人抓狂。

  • 在解決這些錯誤之前,讓我們先了解下關於module的幾種依賴方式的區別(直接看解決方案請跳過)
  1. compile compile是對所有的build type以及favlors都會參與編譯並且打包到最終的apk檔案中。
  2. Provided Provided是對所有的build type以及favlors只在編譯時使用,類似eclipse中的external-libs,只參與編譯,不打包到最終apk。
  3. APK 只會打包到apk檔案中,而不參與編譯,所以不能再程式碼中直接呼叫jar中的類或方法,否則在編譯時會報錯
  4. Test compile Test compile 僅僅是針對單元測試程式碼的編譯編譯以及最終打包測試apk時有效,而對正常的debug或者release apk包不起作用。
  5. Debug compile Debug compile 僅僅針對debug模式的編譯和最終的debug apk打包
  6. Release compile Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包。
  • 衝突解決方案 我們需要用的是Provided,這樣在寫程式碼的時候可以在所屬的Module中正常使用jar中的類,但是要有一個Module以compile的方式依賴這個jar,這樣編譯的時候只有一個jar編譯進apk。 比如現在兩個module發生同時引用一個jar打包時候發生衝突。
  1. 第一個module不發生任何改變。
  2. 設定另一個module引入jar的方式為Provided,這樣改module引入的jar在編譯時候可以使用,即程式碼不會報錯,生成的apk不會包含該jar。在apk執行時候第一個module的jar會共享該module使用,也就是說compile依賴方式是對共所有的呼叫,雖然在編譯時候不能被呼叫。(除了引用module的專案外)
  • 注:使用Provided必須刪除compile fileTree(include: ['*.jar'], dir: 'libs') 不然lib下的jar均按照compile方式引入到Module
  • 來個栗子

  1. 我在專案中使用了Alipay(支付寶),引用了一個Alipay的module。(其中在libs下 有一alipay.jar)

  2. 還在專案中引用了友盟推送,在推送的module中引入的jar檔案和alipay.jar檔案發生衝突。

  3. 首先選擇一個引入方式設定成Provided,因為Alipay只引入了alipay.jar所以選擇,Alipay在Alilpay.build檔案中刪除

  1. //刪除下面這行

  2. compile fileTree(include: ['*.jar'], dir: 'libs')

  3. //新增

  4. provided files('libs/Alipay.jar)

  1. 因為友盟推送jar是和Alipay的支付jar衝突,而不是引用同一個jar,所以解決方式是把友盟推送jar拆分成alipay.jar 和 去tuuid的友盟推送的jar。統一放入libs。

  2. 先在release apk 這樣就ok!!!!

解決了,如下方法可用: 1、新建module library_support ,引用V4 V7  2、引用的開源lib全新增依賴為這個module,並把所有引用library_support依賴的這一項的scope改為provided即可

duplicate entry: com/google/gson/annotations/Expose.class

專案在引入Retrofit2時,執行專案時會報出以下錯誤:

Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/gson/annotations/Expose.class
  • 仔細看了下錯誤報告,確定是gson這個庫有重複導致的問題。  因為在專案的build.gradle中新加入
 compile 'com.squareup.retrofit2:retrofit:2.1.0'
 compile 'com.squareup.retrofit2:converter-gson:2.1.0'

那麼問題就確定了,因為引入了converter-gson:2.1.0所以出現的錯誤。

我們先來查詢一下Expose.class這個類是有哪些重複使用的類庫,在Android Studio中雙擊Shift鍵,開啟搜尋視窗,輸入Expose.class。如圖: 這裡寫圖片描述  可以發現確實是有兩個重複了,那麼現在就來解決這個問題。

解決方法:

在專案中找到External Libraries裡面的converter-gson-2.1.0。如圖: 這裡寫圖片描述 這裡寫圖片描述  開啟pom.xml,檢視裡面gson的groupId。如圖: 這裡寫圖片描述  找到gson的groupId後,我們就要把它去掉就可以了,現在就來把它去掉,步驟如下:  開啟專案的build.gradle,把原來的compile ‘com.squareup.retrofit2:converter-gson:2.1.0’ 改成這樣:

 compile ('com.squareup.retrofit2:converter-gson:2.1.0'){
        exclude group : 'com.google.code.gson'
    }

其中com.google.code.gson就是gson的groupId。  完成之後專案就可以正常運行了!