添加第三方 .aar 文件后无法合并 dex
Unable to merge dex after adding a third party .aar file
我 运行 陷入许多帖子似乎抱怨的 unable to merge dex
问题。经过一些研究,我想我找到了问题的根源,但我不知道如何着手解决它。
我目前正在组合各种第三方组件来创建一个 Android 应用程序。它由以下部分组成:
app
:应用程序本身,这是一个最小的应用程序,带有从 Android Studio 创建的 Kotlin Activity
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 似乎实际上 包含 Guava 18.0 版(在 'classes.jar'部分)。我认为这与 base
在其 build.gradle 中 guava 20.0 的 implementation
依赖行冲突。
因此,我想我找到了冲突的根源(2 个不同版本的番石榴碰撞),但我不确定如何进行。第三方将 guava 打包到 .aar 中是错误的吗?如果是这样,除了要求第三方删除它之外,我还有什么办法解决这个问题吗?
我们尝试过但没有奏效的事情:
- 在包含 AAR 的
implementation
语句中使用 exclude
语句(我怀疑它可能只适用于外部依赖项,不适用于 AAR 中内置的代码)
- 使用
preDexLibraries
(true
对我们中的一些人有效,false
对其他人有效——这不是解决方案!)
我更喜欢 C++/C,所以我可能需要掌握一些 Java 特定的概念。提前感谢您的帮助。
我们找到的唯一解决方案是对第三方 AAR 执行以下操作:
- 使用 .zip 文件编辑器(例如:7-zip)打开 AAR 文件
- 在 AAR
中打开 classes.jar
- 导航到
com
目录
- 删除
google
子目录
然后我们在 gradle 文件中添加了 guava 作为依赖项
它有效,这是正确的做法,我们正在等待第三方提供商的同意。
我 运行 陷入许多帖子似乎抱怨的 unable to merge dex
问题。经过一些研究,我想我找到了问题的根源,但我不知道如何着手解决它。
我目前正在组合各种第三方组件来创建一个 Android 应用程序。它由以下部分组成:
app
:应用程序本身,这是一个最小的应用程序,带有从 Android Studio 创建的 Kotlin Activity
libs
:两个.aar文件,A.aar和B.aar,其中A.aar依赖于B.aarbase
:一个第三方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 似乎实际上 包含 Guava 18.0 版(在 'classes.jar'部分)。我认为这与 base
在其 build.gradle 中 guava 20.0 的 implementation
依赖行冲突。
因此,我想我找到了冲突的根源(2 个不同版本的番石榴碰撞),但我不确定如何进行。第三方将 guava 打包到 .aar 中是错误的吗?如果是这样,除了要求第三方删除它之外,我还有什么办法解决这个问题吗?
我们尝试过但没有奏效的事情:
- 在包含 AAR 的
implementation
语句中使用exclude
语句(我怀疑它可能只适用于外部依赖项,不适用于 AAR 中内置的代码) - 使用
preDexLibraries
(true
对我们中的一些人有效,false
对其他人有效——这不是解决方案!)
我更喜欢 C++/C,所以我可能需要掌握一些 Java 特定的概念。提前感谢您的帮助。
我们找到的唯一解决方案是对第三方 AAR 执行以下操作:
- 使用 .zip 文件编辑器(例如:7-zip)打开 AAR 文件
- 在 AAR 中打开 classes.jar
- 导航到
com
目录 - 删除
google
子目录
然后我们在 gradle 文件中添加了 guava 作为依赖项 它有效,这是正确的做法,我们正在等待第三方提供商的同意。