文章轉(zhuǎn)自:http://blog.csdn.net/u013134391/article/details/51538511
在Android開發(fā)過程中我們多多少少會(huì)引入module页慷,不僅會(huì)提高項(xiàng)目的開發(fā)進(jìn)度厉熟,而且項(xiàng)目管理起來相當(dāng)方便。
但是同一個(gè)項(xiàng)目中引入多個(gè)module引入同一個(gè)jar或有沖突的jar時(shí)候在編譯的時(shí)候會(huì)出現(xiàn)錯(cuò)誤翘盖,這些錯(cuò)誤往往讓人抓狂策州。
- 在解決這些錯(cuò)誤之前,讓我們先了解下關(guān)于module的幾種依賴方式的區(qū)別(直接看解決方案請(qǐng)?zhí)^)
- compile
compile是對(duì)所有的build type以及favlors都會(huì)參與編譯并且打包到最終的apk文件中。 - Provided
Provided是對(duì)所有的build type以及favlors只在編譯時(shí)使用鹉勒,類似eclipse中的external-libs,只參與編譯,不打包到最終apk吵取。 - APK
只會(huì)打包到apk文件中禽额,而不參與編譯,所以不能再代碼中直接調(diào)用jar中的類或方法皮官,否則在編譯時(shí)會(huì)報(bào)錯(cuò) - Test compile
Test compile 僅僅是針對(duì)單元測(cè)試代碼的編譯編譯以及最終打包測(cè)試apk時(shí)有效脯倒,而對(duì)正常的debug或者release apk包不起作用。 - Debug compile
Debug compile 僅僅針對(duì)debug模式的編譯和最終的debug apk打包 - Release compile
Release compile 僅僅針對(duì)Release 模式的編譯和最終的Release apk打包捺氢。
- 沖突解決方案
我們需要用的是Provided藻丢,這樣在寫代碼的時(shí)候可以在所屬的Module中正常使用jar中的類,但是要有一個(gè)Module以compile的方式依賴這個(gè)jar摄乒,這樣編譯的時(shí)候只有一個(gè)jar編譯進(jìn)apk悠反。
比如現(xiàn)在兩個(gè)module發(fā)生同時(shí)引用一個(gè)jar打包時(shí)候發(fā)生沖突。
- 第一個(gè)module不發(fā)生任何改變馍佑。
- 設(shè)置另一個(gè)module引入jar的方式為Provided斋否,這樣改module引入的jar在編譯時(shí)候可以使用,即代碼不會(huì)報(bào)錯(cuò)挤茄,生成的apk不會(huì)包含該jar如叼。在apk運(yùn)行時(shí)候第一個(gè)module的jar會(huì)共享該module使用,也就是說compile依賴方式是對(duì)共所有的調(diào)用穷劈,雖然在編譯時(shí)候不能被調(diào)用笼恰。(除了引用module的項(xiàng)目外)
- 注:使用Provided必須刪除compile fileTree(include: ['*.jar'], dir: 'libs') 不然lib下的jar均按照compile方式引入到Module
-
來個(gè)栗子
我在項(xiàng)目中使用了Alipay(支付寶),引用了一個(gè)Alipay的module歇终。(其中在libs下 有一alipay.jar)
還在項(xiàng)目中引用了友盟推送社证,在推送的module中引入的jar文件和alipay.jar文件發(fā)生沖突。
-
首先選擇一個(gè)引入方式設(shè)置成Provided评凝,因?yàn)锳lipay只引入了alipay.jar所以選擇追葡,Alipay在Alilpay.build文件中刪除
//刪除下面這行 compile fileTree(include: ['*.jar'], dir: 'libs') //添加 provided files('libs/Alipay.jar)
因?yàn)橛衙送扑蚸ar是和Alipay的支付jar沖突,而不是引用同一個(gè)jar奕短,所以解決方式是把友盟推送jar拆分成alipay.jar 和 去tuuid的友盟推送的jar宜肉。統(tǒng)一放入libs。
先在release apk 這樣就ok!!!!