【发布时间】:2015-02-03 03:50:27
【问题描述】:
今天,当我将一个库 (MaterialDesignLibrary) 添加到使用另一个库 (Float Labeled EditText) 的项目时,我遇到了多个 dex 文件的问题。
通过研究,我发现冲突来自两个库都使用 Nineoldandroids 作为依赖项。我测试并看到 Float Labeled EditText 导致我的项目在 gradle 同步时在我的外部库中添加“library-2.4.0.jar”,而 Material Design Library 包括“ “/libs”下的nineoldandroids-2.4.0.jar”文件。
我尝试在这里和那里删除重复项,搜索了几个小时的解决方案,但仍然没有运气。
请问这个jar文件名是不是dex合并失败导致多个dex错误的原因?或者 DexMerger 是否足够聪明,可以找出两个不同的 jar 文件实际上是同一个依赖项?
我不得不说我还是不太清楚 DexMerger 是如何工作的。
以下是我得到的错误:
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
...
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/nineoldandroids/animation/Animator$AnimatorListener;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
编辑 12/5
我什至尝试在 app/libs 中只放置一份 Nineoldandroids-2.4.0.jar,从其他两个模块(materialLib 和 floatlabeledittext)中删除所有引用,包括 jar 或 maven repo 依赖项。然后我在两个模块中添加了
compile files(':app/libs/nineoldandroids-2.4.0.jar')
确保只有一份被引用的 jar 文件。
build.gradle 在我的应用中有
compile project(':materialLib')
compile project(':floatlabeledittext')
在依赖项下。还是多个dex错误。还尝试了清理、Gradle 同步、使缓存/重新启动无效。知道我缺少什么吗?
【问题讨论】:
-
分享你的构建 gradle 文件。基本上,您或您的依赖项不止一次引用了 Nineoldannotations。您应该排除除一个以外的所有引用
-
我尝试删除所有nineoldandroids的引用,但只有一个引用,但是库(没有nineoldandroids jar文件)无法从nineoldandroids中找到com.nineoldandroids.animation等的引用。
-
将
nineoldandroids保留在 lib 项目中,但将其从您的编译中删除
标签: android android-studio dependencies dex nineoldandroids