我遇到许多帖子似乎抱怨的unable to merge dex
问题。在做了一些研究之后,我想我找到了问题的根源,但我不知道如何解决它。
我目前正在组建各种第三方组件来创建Android应用程序。它由以下部分组成:
app
:应用程序本身,这是一个使用Android Studio创建的Kotlin活动的最小应用程序libs
:两个.aar文件,A.aar和B.aar,其中A.aar依赖于B.aar base
:第三方java模块,它提供一些接口,辅助函数并包含一些依赖项。该模块有自己的build.gradle文件。我按照以下步骤整合了它们:
base
添加为app
的依赖项,那么所有内容都会构建implementation B.aar
)时,gradle构建失败并显示错误:Unable to merge dex
。查看Gradle堆栈跟踪,我发现它抱怨多个dex文件定义Lcom.google.common.io.ByteSink
,它似乎是Google的Guava库。
使用Android Studio中的项目视图,B.aar似乎实际上包含版本18.0的番石榴(在' classes.jar'部分下)。我认为这与其build.gradle中的guava 20.0的base
' s implementation
依赖行冲突。
因此,我认为我找到了冲突的根源(2种不同版本的番石榴碰撞),但我不知道该怎么办。将第三方包装好的番石榴放入.aar是不是错了?如果是这样,除了要求第三方删除它之外,我是否有办法解决此问题?
我们尝试过但没有效果的事情:
exclude
语句中使用implementation
语句(我怀疑它可能只适用于外部依赖项,而不是内置于AAR中的代码)preDexLibraries
(true
为我们中的一些人工作,false
为其他人工作 - 它不是解决方案!)我更多的是C ++ / C家伙,所以我可能需要掌握一些特定于Java的概念。我提前感谢你的帮助。
答案 0 :(得分:0)
我们找到的唯一解决方案是对第三方AAR执行以下操作:
com
目录google
子目录然后我们在gradle文件中添加了guava作为依赖项 它有效,这是正确的做法,我们正在等待第三方提供商的确定。