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

同一Gradle项目中Wire生成客户端服务端gRPC接口重复类问题求解

问题根因

你当前配置的两个Wire模块都指定了全量proto包路径作为生成范围,除了生成各自角色的gRPC服务接口外,还都生成了完全重复的Proto消息模型类,最终打包时出现类定义冲突。

可行解决方案

方案1:拆分模块分层生成(推荐)

将proto生成逻辑拆分为3个模块,从根源避免重复生成:

  1. 新增公共基础模块proto-common,仅生成通用消息模型,不生成任何RPC相关代码,配置如下:
wire {
    kotlin {
        includes = ['com.company.android.proto.*']
        out "${buildDir}/protos"
        // 仅生成消息、枚举等模型类
        rpcRole = 'none'
    }
}
  1. 原有客户端、服务端两个模块都依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 22:36:08