【问题标题】:What to do when two libraries insist on using the same namespace?两个库坚持使用同一个命名空间怎么办?
【发布时间】:2018-03-30 14:35:36
【问题描述】:

在我的 Android 项目中,我有 2 个都依赖于 WebRTC 的库。这两个库都强制包含 WebRTC。这两个库都没有重命名 WebRTC 库(尽管有自定义)。两位开发者都坚称必须以这种方式强制包含 WebRTC(我对此深表怀疑)。

我该如何解决这个依赖冲突?

我已经尝试过这里描述的解决方案:
https://medium.com/mindorks/avoiding-conflicts-in-android-gradle-dependencies-28e4200ca235 但这特别需要依赖关系是可传递的。在我的情况下,哪些硬包含的库不是。如果我打电话给gradlew dependencies,WebRTC 甚至不会出现在该列表中。但是在编译时,我得到像Multiple dex files define Lorg/webrtc/VideoFileRenderer$2; 这样的错误,其中“VideoFileRenderer”是每次编译时与 org.webrtc 不同的文件。清理构建树或缓存没有解决任何问题。

有问题的库是:

这两个库在运行时绝不会同时使用。我只需要在编译时包含两者。此外,每个用户在注册时只进行一次视频通话以表明自己的身份。

【问题讨论】:

  • 我认为除非您可以重新编译这些库,否则您无能为力。您可以使用这些提供者(ahoy 和 tokbox)在构建 WebRTC 时为 WebRTC 类(例如 com.ahoy.org.webrtc)使用自定义命名空间,这样它们之间就不会发生冲突。
  • 感谢您的回复。很难相信没有其他解决方案。毕竟,考虑到库的数量,我不能成为第一个遇到这个问题的开发人员。

标签: android gradle webrtc aar


【解决方案1】:

为其中之一排除 WebRTC

从我的项目中排除的示例(显然更改您的库的名称)

  compile('io.socket:socket.io-client:0.9.0') {
        // excluding org.json which is provided by Android
        exclude group: 'org.json', module: 'json'
    }

【讨论】:

  • exclude 命令仅适用于传递依赖。不是硬编码的。
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2018-08-09
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多