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

如何解决Android项目中两个依赖的Protobuf版本冲突问题

Android项目Protobuf版本冲突解决方案

问题背景

开发Android项目时,同时引入两个依赖不同Protobuf版本的第三方库:

implementation 'io.livekit:livekit-android:2.5.0' // 依赖protobuf-javalite 3.22.0
implementation 'org.whispersystems:signal-protocol-java:2.8.1' // 依赖protobuf-javalite 3.10.0

版本兼容矛盾:

  • 全局强制使用3.10.0版本时,signal-protocol-java正常运行,但livekit-android抛出数组越界异常
  • 全局强制使用3.22.0版本时,livekit-android正常运行,但signal-protocol-java抛出类型转换异常

尝试过的全局强制配置无效:

configurations {
    configureEach {
        resolutionStrategy {
            force group: 'com.google.protobuf', name: 'protobuf-javalite', version: '3.10.0'
        }
    }
}

报错信息

Livekit报错

java.lang.ArrayIndexOutOfBoundsException: length=10; index=10
21:57:31.586  W     at com.google.protobuf.MessageSchema.newSchemaForRawMessageInfo(MessageSchema.java:502)
21:57:31.587  W     at com.google.protobuf.MessageSchema.newSchema(MessageSchema.java:221)
21:57:31.587  W     at com.google.protobuf.ManifestSchemaFactory.newSchema(ManifestSchemaFactory.java:85)
21:57:31.587  W     at com.google.protobuf.ManifestSchemaFactory.createSchema(ManifestSchemaFactory.java:71)
21:57:31.587  W     at com.google.protobuf.Protobuf.schemaFor(Protobuf.java:93)
21:57:31.587  W     at com.google.protobuf.MessageSchema.getMessageFieldSchema(MessageSchema.java:4849)
21:57:31.587  W     at com.google.protobuf.MessageSchema.mergeFromHelper(MessageSchema.java:4241)
21:57:31.587  W     at com.google.protobuf.MessageSchema.mergeFrom(MessageSchema.java:3846)
21:57:31.587  W     at com.google.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1531)
21:57:31.587  W     at com.google.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1630)
21:57:31.587  W     at com.google.protobuf.GeneratedMessageLite.parseFrom(GeneratedMessageLite.java:1619)
21:57:31.587  W     at com.google.protobuf.GeneratedMessageLite.parseFrom(GeneratedMessageLite.java:1612)
21:57:31.587  W     at livekit.LivekitModels$DataPacket.parseFrom(LivekitModels.java:11352)
21:57:31.587  W     at io.livekit.android.room.RTCEngine.onMessage(RTCEngine.kt:970)
21:57:31.587  W     at io.livekit.android.room.RTCEngine$DataChannelObserver.onMessage(RTCEngine.kt:1006)

Whispersystems报错

Process: com.app.package, PID: 12793
                 java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.String
                    at com.google.protobuf.MessageSchema.newSchemaForRawMessageInfo(MessageSchema.java:507)
                    at com.google.protobuf.MessageSchema.newSchema(MessageSchema.java:227)
                    at com.google.protobuf.ManifestSchemaFactory.newSchema(ManifestSchemaFactory.java:77)
                    at com.google.protobuf.ManifestSchemaFactory.createSchema(ManifestSchemaFactory.java:71)
                    at com.google.protobuf.Protobuf.schemaFor(Protobuf.java:90)
                    at com.google.protobuf.Protobuf.schemaFor(Protobuf.java:104)
                    at com.google.protobuf.GeneratedMessageLite.makeImmutable(GeneratedMessageLite.java:175)
                    at com.google.protobuf.GeneratedMessageLite$Builder.buildPartial(GeneratedMessageLite.java:397)
                    at com.google.protobuf.GeneratedMessageLite$Builder.build(GeneratedMessageLite.java:405)
                    at org.whispersystems.libsignal.state.SessionState.<init>(SessionState.java:46)
                    at org.whispersystems.libsignal.state.SessionRecord.<init>(SessionRecord.java:25)

可行解决方案

1. 局部依赖版本隔离

放弃全局强制版本,为每个库单独指定所需的Protobuf版本,通过排除自带依赖+单独引入的方式实现:

// 排除两个库自带的Protobuf依赖
implementation ('io.livekit:livekit-android:2.5.0') {
    exclude group: 'com.google.protobuf', module: 'protobuf-javalite'
}
implementation ('org.whispersystems:signal-protocol-java:2.8.1') {
    exclude group: 'com.google.protobuf', module: 'protobuf-javalite'
}

// 定义两个独立配置分别管理不同版本的Protobuf
configurations {
    livekitProto
    signalProto
}

// 引入对应版本的Protobuf
livekitProto 'com.google.protobuf:protobuf-javalite:3.22.0'
signalProto 'com.google.protobuf:protobuf-javalite:3.10.0'

// 将两个版本的Protobuf加入依赖
dependencies {
    implementation files(configurations.livekitProto.files + configurations.signalProto.files)
}

注意:这种方式可能存在类加载冲突风险,需测试验证两个库的类加载是否相互独立。

2. 升级/降级第三方库

  • 检查signal-protocol-java的最新版本,确认是否已兼容Protobuf 3.22.0+,若有则升级到对应版本,消除版本差
  • 查看livekit-android的历史版本,寻找依赖Protobuf 3.10.x的版本,降级使用以匹配signal库的依赖

3. 类加载隔离(高级方案)

通过自定义类加载器隔离两个库的Protobuf依赖:

  1. 将signal-protocol-java和protobuf-javalite 3.10.0打包为单独的dex文件
  2. 在应用中使用DexClassLoader加载该dex文件
  3. 调用signal相关API时,通过该类加载器获取类实例,避免与全局Protobuf类冲突

4. 反馈给开源库维护者

分别给livekit-android和signal-protocol-java提交Issue,说明依赖冲突问题,请求官方提供兼容更广Protobuf版本的更新。

内容的提问来源于stack exchange,提问作者Ashif Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:58:09