gradle多工程打包冲突问题

来源:互联网 发布:qq变声软件下载 编辑:程序博客网 时间:2024/06/07 20:07

将一个项目由eclipse转android studio时,由于该项目引用lib多达6、7个,一上手就碰到了引用包冲突的问题,问题描述如下

UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)        at com.android.dx.command.dexer.Main.run(Main.java:277)        at com.android.dx.command.dexer.Main.main(Main.java:245)        at com.android.dx.command.Main.main(Main.java:106)

虽然这个问题在网上有很多类似解决的帖子,但均说的不全面详细,,我另外花了不少时间才把问题彻底解决,,在这里把经验分享出来。

第一步: 
如果直接使用v4的jar包,gradle打包时,会将v4包打包进当前module,如果有引用该module的其它工程,会再将该module中的v4包再编译一次,导致v4包被打包多次,引起冲突。在对应项目的build目录下,你可以发现实实在在的存在多个v4包,只是它们的名字会多了一串sha1算法生成的字符串:

\build\intermediates\pre-dexed\official\debug

解决办法:在build.gradle中加入compile ‘com.android.support:support-v4:23.1.0’并删除libs目录下的v4包,这样可以避免多v4包的冲突问题(注意对应版本的V4包你是否下载,否则会另报错):

dependencies {    compile fileTree(dir: 'libs', include: '*.jar')    compile 'com.android.support:support-v4:23.1.0'}

如果第一步可以了,那恭喜你,下面的内容可以暂时忽略了(如果以后没有包冲突的问题)。 
但一般引用lib库多,由eclipse转的时候并不一定能这样理想,所以如果还有冲突,请继续看第二步。

第二步 
既然还有冲突,那就去找到实际冲突的文件是哪些。 
首先打开项目的root目录,也就是项目文件夹同一级的目录,会有一些gradle project的基本配置,目录结构如下:

your project/    src/    res/build/build.gradlesettings.gradle

打开build文件夹,定位到build\intermediates\dex-cache下,会有cache.xml这样一个文件。 
它记录了你的项目中所有依赖的库的路径、版本信息、编译后存入的路径,如下:

 

<item        jar="C:\tfs\you project\libs\android-support-v4.jar"        jumboMode="false"        revision="23.0.2"        sha1="5896b0a4e377ac4242eb2bc785220c1c4fc052f4">        <dex dex="C:\tfs\your project\build\intermediates\pre-dexed\official\debug\android-support-v4_8d5ef003cbda980f7be9134c6bb7eb7a566626d2.jar" />    </item>

搜索其中的android-support-v4.jar,这些即是多余的引起冲突的包了,根据它提供的路径,找到并删除该jar。实际操作时,仅删除jar是不够的,由于gradle缓存文件的问题,上一次的编译可能已经将jar在build目录下编译了对应的文件,,所以直接将整个build目录删除了,避免缓存带来的删除jar不生效的问题。

这样再次编译应该就能解决v4包冲突的问题了。

如果存在其它类似的引用冲突的问题(基本上带Multiple dex的提示信息都是同一个问题),,也可以直接打开cache.xml,去定位问题。 
gradle打包初次上手会有不少问题,,基本上找关键字build或gradle的目录或文件,分析一下应该会很容易找到解决方法。




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买活羊 羬羊 羊羊100羊羊羊 恒源祥 羊羊羊 羊琼皮 羝羊 羊和羊相配吗 羊与羊相配吗 梦见买羊 羊羊羊恒源祥 羊地 羊穿的价格 羊什么 .羊 莫宰羊 羊刁习 邓羊羊 俊俊羊羊 羊羊羊羊 羊羊羊羊羊羊 羊羊对战 甜羊羊图片 手机可以买股票吗 买什么股票 新手应该去买什么股票 买股票用什么软件 基金股票买哪个好 买美股如何开户 手机买股票软件 手机上怎么买股票和卖股票 股票在哪里买 手机买股票 国内如何买美股 新手买股票流程 开户后怎么买股票 手机买股票怎么开户 手机上怎么买股票 如何买港股股票 什么软件可以买股票 网上怎么开户买股票 涨停股票如何买入