Android集成Jitsi Meet与Sendbird SDK报依赖重复冲突错误
问题根因
这个冲突的核心是两个SDK各自内置了独立编译的WebRTC实现:
- Jitsi Meet SDK 6.0.0通过传递依赖
react-native-webrtc引入了org.webrtc包下的所有Java类,以及对应架构的libjingle_peerconnection_so.sonative库 - Sendbird Calls SDK 1.8.0同样内置了相同包名的WebRTC Java类和同名native库
Gradle在执行checkDebugDuplicateClasses任务时会校验同路径类、同路径so的唯一性,两个SDK的重名文件直接触发构建失败。
解决方案
方案一:统一WebRTC依赖版本(侵入性最低,优先验证)
这个方案的思路是移除两个SDK自带的WebRTC依赖,单独引入一份两个SDK都兼容的WebRTC版本,从根源消除重名问题。
- 修改app模块
build.gradle的依赖块,替换原有配置为如下内容,先排除两个SDK自带的WebRTC传递依赖:
// Sendbird IM SDK无WebRTC依赖,不需要修改 implementation 'com.sendbird.sdk:sendbird-android-sdk:3.1.15' // 排除Sendbird Calls内置的WebRTC依赖 implementation('com.sendbird.sdk:sendbird-calls:1.8.0') { exclude group: 'org.webrtc' } // 排除Jitsi SDK传递引入的react-native-webrtc模块(该模块内置了另一份WebRTC) implementation('org.jitsi.react:jitsi-meet-sdk:6.0.0') { transitive = true exclude group: 'com.oney', module: 'react-native-webrtc' } // 单独引入和Jitsi 6.0.0版本对齐的react-native-webrtc(WebRTC M106版本),作为全局统一的WebRTC依赖 implementation 'com.oney:react-native-webrtc:106.0.0-beta.3'
- 在同文件的
android配置块中添加packagingOptions规则,处理剩余的native库重复问题:
android { // 保留你原有的compileSdk、defaultConfig等配置不变 packagingOptions { pickFirst 'lib/arm64-v8a/libjingle_peerconnection_so.so' pickFirst 'lib/armeabi-v7a/libjingle_peerconnection_so.so' pickFirst 'lib/x86/libjingle_peerconnection_so.so' pickFirst 'lib/x86_64/libjingle_peerconnection_so.so' } }
- 执行
./gradlew clean清理构建缓存后重新编译即可。
验证提示:如果编译通过但Sendbird通话出现ICE连接失败、本地视频黑屏等异常,说明统一用的M106版本和Sendbird Calls 1.8.0不兼容,可以把单独引入的WebRTC版本替换为Sendbird Calls 1.8.0内置的M92版本,重新验证功能即可。
方案二:类隔离重打包(稳定性最高,适合生产环境)
如果统一WebRTC版本后出现两个SDK功能异常(比如Jitsi屏幕共享失效、Sendbird音频降噪不生效),说明两个SDK依赖的WebRTC版本有定制修改,无法共用,此时需要通过字节码重定位的方式把两份WebRTC完全隔离:
- 在项目根目录的
build.gradle中引入Shadow重打包插件:
buildscript { repositories { mavenCentral() google() } dependencies { // 其他原有classpath依赖保留 classpath 'com.github.jengelman.gradle.plugins:shadow:7.1.2' } }
- 对其中一个SDK的WebRTC类做包名重定位,比如将Sendbird Calls内置的
org.webrtc包重命名为org.sendbird.webrtc,同时修改SDK内加载native库的逻辑,将其加载的so文件重命名为独立文件名,确保两个SDK加载的WebRTC实例完全独立,不会出现类、so重名问题。
注意:这个方案需要对SDK做二次打包,后续升级Sendbird或Jitsi版本时需要重新执行重打包操作,维护成本稍高,但不会存在版本兼容问题。
避坑提醒
- 不要只配置
pickFirst规则不处理重复类:这种方式虽然能跳过构建校验,但运行时类加载器会随机加载其中一个版本的WebRTC类,大概率触发NoSuchMethodError、native方法签名不匹配的崩溃。 - 编译通过后必须覆盖全场景测试:包括Sendbird一对一/群组音视频、IM消息收发,Jitsi会议进出、音视频开关、屏幕共享、会议内聊天等功能,避免隐性兼容问题。
内容的提问来源于stack exchange,提问作者Bandish Sapphire
相关产品推荐
相关产品推荐

