添加第三方.aar文件

时间:2018-01-20 22:12:44

标签: java android gradle multidex

我遇到许多帖子似乎抱怨的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的依赖项,那么所有内容都会构建
  • 当我在应用程序的build.gradle中添加A.aar作为依赖项时,它仍然构建
  • 然后,当我添加B.aar作为应用程序的依赖项(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是不是错了?如果是这样,除了要求第三方删除它之外,我是否有办法解决此问题?

我们尝试过但没有效果的事情:

  • 在包含AAR的exclude语句中使用implementation语句(我怀疑它可能只适用于外部依赖项,而不是内置于AAR中的代码)
  • 使用preDexLibrariestrue为我们中的一些人工作,false为其他人工作 - 它不是解决方案!)

我更多的是C ++ / C家伙,所以我可能需要掌握一些特定于Java的概念。我提前感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我们找到的唯一解决方案是对第三方AAR执行以下操作:

  • 使用.zip文件编辑器(例如:7-zip)
  • 打开AAR文件
  • 在AAR中打开classes.jar
  • 导航至com目录
  • 删除google子目录

然后我们在gradle文件中添加了guava作为依赖项 它有效,这是正确的做法,我们正在等待第三方提供商的确定。