【问题标题】:Including same jar library in application module and library module在应用程序模块和库模块中包含相同的 jar 库
【发布时间】:2017-04-29 23:24:17
【问题描述】:

我有一个 Android 应用程序,它有一个主应用程序模块和一个库模块。主应用程序模块和库模块都依赖于外部 jar 库。构建时出现以下错误

Dex:将字节码转换为 dex 时出错: 原因:com.android.dex.DexException: Multiple dex files defined

我了解这是由于两次包含同一个 jar 造成的。如果不将项目重组为只使用一次 jar,我能做些什么吗?

【问题讨论】:

  • 什么是罐子?你找不到它的 Maven/Gradle 依赖项吗?
  • 它是一个专有的 jar。我不认为它是在 Maven 中发布的。在这种情况下,找到依赖关系有什么帮助?
  • 因为 gradlew 比压缩 jar 文件更好地处理依赖项中的重复文件
  • 我对 gradle 构建系统非常陌生,或者实际上除了 make 之外的任何构建系统。我从 jar 中使用的功能对于应用程序模块和库模块都是相同的。我不确定我是否可以排除任何东西。
  • 好的。我认为下面的答案应该有效,如果没有,添加你所有的 build.gradle 文件和 settings.gradle

标签: android android-gradle-plugin


【解决方案1】:

问题

发生这种情况是因为您的应用依赖于库模块。因为库模块已经有 jar 依赖,所以你会得到这个错误。

我会进一步解释。你有Module-AModule-BModule-C

Module-B 依赖于Module-C

Module-A 取决于 Module-BModule-C

但由于Module-B 已经依赖于Module-C,你就会遇到问题。

解决方案

使库模块成为 jar 的唯一依赖项。

也就是说,让Module-A 依赖于Module-B,而不需要让它依赖于Module-C

【讨论】:

  • 为什么投反对票?我相信我的回答是正确的。如果不是,请指出,我很乐意删除它。谢谢!
  • 我不会投反对票。您的解决方案没有错,但它没有回答我的问题。我重组了我的应用程序以从主模块中删除 jar 依赖项。但我预计 jar 的工作方式与 .so 或 .dll 的工作方式类似。就像我有 libsqlite.so 取决于 libc.so 和 libstagefright.so 取决于 libc.so。 libsqlite.so 和 libstagefright.so 都可以链接到我的主应用程序。我在java中遇到了类似的情况。
  • @digitizedx 我错过了你问题的哪一部分?
  • 我会解释我的要求。我有一个提供日志服务的 logger.jar。我的 aar 和 main 模块都需要记录器。如果我将它包含在两个 build.gradles 中,我会在最终应用程序创建期间收到 dex 错误。我该如何解决这个问题
  • @digitizedx 我更新了我的答案以更详细地解释。它仍然是相同的解决方案。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多