You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android集成Jitsi Meet与Sendbird SDK报依赖重复冲突错误

问题根因

这个冲突的核心是两个SDK各自内置了独立编译的WebRTC实现:

  • Jitsi Meet SDK 6.0.0通过传递依赖react-native-webrtc引入了org.webrtc包下的所有Java类,以及对应架构的libjingle_peerconnection_so.so native库
  • Sendbird Calls SDK 1.8.0同样内置了相同包名的WebRTC Java类和同名native库
    Gradle在执行checkDebugDuplicateClasses任务时会校验同路径类、同路径so的唯一性,两个SDK的重名文件直接触发构建失败。
解决方案

方案一:统一WebRTC依赖版本(侵入性最低,优先验证)

这个方案的思路是移除两个SDK自带的WebRTC依赖,单独引入一份两个SDK都兼容的WebRTC版本,从根源消除重名问题。

  1. 修改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'
  1. 在同文件的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'
    }
}
  1. 执行./gradlew clean清理构建缓存后重新编译即可。

验证提示:如果编译通过但Sendbird通话出现ICE连接失败、本地视频黑屏等异常,说明统一用的M106版本和Sendbird Calls 1.8.0不兼容,可以把单独引入的WebRTC版本替换为Sendbird Calls 1.8.0内置的M92版本,重新验证功能即可。

方案二:类隔离重打包(稳定性最高,适合生产环境)

如果统一WebRTC版本后出现两个SDK功能异常(比如Jitsi屏幕共享失效、Sendbird音频降噪不生效),说明两个SDK依赖的WebRTC版本有定制修改,无法共用,此时需要通过字节码重定位的方式把两份WebRTC完全隔离:

  1. 在项目根目录的build.gradle中引入Shadow重打包插件:
buildscript {
    repositories {
        mavenCentral()
        google()
    }
    dependencies {
        // 其他原有classpath依赖保留
        classpath 'com.github.jengelman.gradle.plugins:shadow:7.1.2'
    }
}
  1. 对其中一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:24:34