同一Gradle项目中Wire生成客户端服务端gRPC接口重复类问题求解
问题根因
你当前配置的两个Wire模块都指定了全量proto包路径作为生成范围,除了生成各自角色的gRPC服务接口外,还都生成了完全重复的Proto消息模型类,最终打包时出现类定义冲突。
可行解决方案
方案1:拆分模块分层生成(推荐)
将proto生成逻辑拆分为3个模块,从根源避免重复生成:
- 新增公共基础模块
proto-common,仅生成通用消息模型,不生成任何RPC相关代码,配置如下:
wire { kotlin { includes = ['com.company.android.proto.*'] out "${buildDir}/protos" // 仅生成消息、枚举等模型类 rpcRole = 'none' } }
- 原有客户端、服务端两个模块都依赖
proto-common模块,调整自身的Wire配置,仅生成对应角色的服务接口,不生成消息模型:
// 客户端模块配置,服务端仅修改rpcRole为server即可 wire { kotlin { // 仅包含你定义的gRPC Service全限定名,不要包含消息类所在范围 includes = ['com.company.android.proto.GreeterService'] out "${buildDir}/protos" rpcCallStyle = 'suspending' rpcRole = 'client' } }
如果你的Service和消息类在同一个包下,也可以通过添加excludes规则排除消息类的生成范围。
方案2:自定义Gradle任务清理重复类
如果不想拆分模块,可以在客户端、服务端模块的构建流程中插入自动清理逻辑,在Wire生成代码后、编译前删除重复的消息模型类,仅保留服务接口:
// 客户端/服务端模块的build.gradle添加以下配置 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { dependsOn deleteDuplicateProtoModels } task deleteDuplicateProtoModels(type: Delete) { delete fileTree("${buildDir}/protos") { // 匹配所有proto生成的kotlin文件 include '**/com/company/android/proto/*.kt' // 排除服务接口类,仅删除消息模型类 exclude '**/*Service*.kt' } }
注意事项
你当前客户端配置中的includes规则存在拼写错误:com..caompany.android.proto.*多了一个点且company拼写错误,需要修正避免匹配异常。
内容的提问来源于stack exchange,提问作者lilienberg
相关产品推荐
相关产品推荐

