關(guān)鍵字
android, multidexenable, jar包名沖突
描述
android開(kāi)發(fā), 在對(duì)接一個(gè)第三方讀卡模塊時(shí)遇到一個(gè)奇葩的bug: 同一個(gè)jar包, 用供應(yīng)商的demo運(yùn)行, 可以正常編譯, 運(yùn)行; 而將jar包放到我們的項(xiàng)目中, 編譯時(shí)會(huì)提示包名沖突如下:
看錯(cuò)誤提示的字面提示, 是編譯時(shí)發(fā)現(xiàn)有多個(gè)類名為com.hdos.idCardUartDevice.JniRetureData的class文件, 即包名沖突了;
然而查看所有依賴庫(kù), 并沒(méi)有找到相同包名的類; 移除該Jar包后, 在應(yīng)用運(yùn)行時(shí)去反射獲取其對(duì)應(yīng)的Class, 提示ClassNotFound, 說(shuō)明公司項(xiàng)目是沒(méi)有這個(gè)類的;
對(duì)比demo和公司項(xiàng)目, 發(fā)現(xiàn)項(xiàng)目的gradle中配置了如下屬性:
在供應(yīng)商的demo中添加該配置后, 編譯時(shí)報(bào)錯(cuò)
Error while generating the main dex list, Program type already present: com.hdos.idCardUartDevice.JniRetureData, 仍然是包名沖突
分析
-
用winrar打開(kāi)jar包, 果然發(fā)現(xiàn)有兩個(gè)同名文件, 解壓時(shí)也會(huì)提示文件重復(fù), 是否需要覆蓋 說(shuō)明確實(shí)是有相同包名的類
-
奇怪的是: 用360zip打開(kāi), 并沒(méi)有顯示上述現(xiàn)象
-
用代碼去處理jar包, 有相同包名的類文件
解決
方案一: 去掉 multiDexEnable true
multiDexEnable 主要是用于解決APP的65536的問(wèn)題, 這個(gè)配置其實(shí)坑挺多的, 如果應(yīng)用內(nèi)可以不添加這個(gè)配置, 最好是不添加;
方案二: 重新打jar包
其實(shí)問(wèn)題就出在jar包會(huì)有重名的類
jar包是供應(yīng)商提供的, 問(wèn)題反饋到了, 對(duì)方試了幾次后仍然沒(méi)有改好, 最后一口咬定他們的demo沒(méi)有問(wèn)題, 其他廠家也沒(méi)問(wèn)題; 所以供應(yīng)商沒(méi)有繼續(xù)改了, 當(dāng)然對(duì)方的模塊也沒(méi)用上;
本著強(qiáng)迫癥的心態(tài), 經(jīng)過(guò)多方摸索后終于把jar包修改好, 不再類名沖突; 修改方法其實(shí)很簡(jiǎn)單
用的仍然是供應(yīng)商的jar包, 使用360zip解壓后再重新用360zip壓縮, 再把后綴.zip改為.jar就可以了