集成Firebase性能监控时protobuf版本冲突及运行时异常解决求助
问题根因
- 项目原有依赖的
com.google.protobuf:protobuf-lite:3.0.1是Protobuf官方已废弃的旧包名,3.10.0版本之后官方将轻量版Protobuf包名改为com.google.protobuf:protobuf-javalite,两个包存在大量相同全限定名的类,因此出现编译阶段类重复冲突。 - 引入的Firebase BOM 28.3.0依赖的是
protobuf-javalite:3.14.0,全局排除旧的protobuf-lite后,原有业务代码依赖的旧版Protobuf API和新版javalite的API不兼容,同时Firebase用到的新版API在旧版中不存在,因此出现运行时类找不到、方法找不到的报错。
解决方案
按以下步骤修改配置即可:
- 第一步:移除之前添加的全局排除
protobuf-lite的配置。 - 第二步:在module级的
build.gradle中添加如下配置,强制统一Protobuf版本,同时将旧的protobuf-lite依赖替换为同版本的protobuf-javalite:
configurations.all { // 强制所有protobuf相关依赖统一使用3.14.0版本,和Firebase依赖的版本对齐 resolutionStrategy.force 'com.google.protobuf:protobuf-javalite:3.14.0' resolutionStrategy.force 'com.google.protobuf:protoc:3.14.0' // 将所有对旧版protobuf-lite的依赖替换为新版的protobuf-javalite resolutionStrategy.dependencySubstitution { substitute module('com.google.protobuf:protobuf-lite') using module('com.google.protobuf:protobuf-javalite:3.14.0') } }
- 第三步:如果项目中有用到Protobuf编译插件生成代码,需要同步修改protobuf插件的配置,将lite选项改为javalite:
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.14.0' } generateProtoTasks { all().each { task -> task.builtins { // 把原来的lite {} 配置替换为下面的javalite配置 javalite { option 'lite' } } } } }
- 第四步:清理项目缓存后重新编译:依次执行
Build -> Clean Project、Build -> Rebuild Project即可。
如果编译时出现少量Protobuf相关的API调用报错,直接按新版javalite的API规范调整即可,绝大多数常用API和旧版lite完全一致。
内容的提问来源于stack exchange,提问作者pingan li
相关产品推荐
相关产品推荐

