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

Android升级Gradle7.0.1使用gRPC插件时出现proto文件路径被遮蔽编译错误

问题解决方案

以下是三种可直接落地的解决方式,可根据你的项目实际需求选择:

  • 优先推荐方案:移除重复依赖
    你当前使用protobuf lite模式生成代码,io.grpc:grpc-protobuf-lite:1.40.1已经内置了lite版本的公共proto定义,不需要额外单独引入完整的protobuf-java依赖,直接删除如下行即可从根源避免重复文件冲突:
protobuf "com.google.protobuf:protobuf-java:3.17.3"

修改完成后执行./gradlew clean清除旧构建缓存,再重新打包即可正常编译。

  • 方案二:调整proto路径优先级
    如果你的项目确实需要保留protobuf-java依赖,可以手动指定protoc的proto路径搜索顺序,将被遮蔽的目录放到搜索顺序的最前面,修改你的generateProtoTasks配置块即可:
generateProtoTasks {
    all().each { task ->
        // 手动指定proto路径顺序,extracted-protos优先于extracted-include-protos
        task.protoPath = files(
            "${projectDir}/src/main/proto",
            "${buildDir}/extracted-protos/main",
            "${buildDir}/extracted-include-protos/${task.name.replace("generate", "").replace("Proto", "").toLowerCase()}"
        )
        task.builtins {
            java { option 'lite' }
        }
        task.plugins {
            grpc { option 'lite' }
        }
    }
}
  • 方案三:过滤extracted-include-protos目录
    如果你的项目完全不需要从第三方依赖中导入proto定义,可以直接过滤掉extracted-include-protos目录的输入,避免重复文件被扫描到:
generateProtoTasks {
    all().each { task ->
        // 过滤掉extracted-include-protos目录下的所有proto文件
        task.inputs.files = task.inputs.files.filter { 
            !it.path.contains("extracted-include-protos") 
        }
        task.builtins {
            java { option 'lite' }
        }
        task.plugins {
            grpc { option 'lite' }
        }
    }
}

注意:如果项目依赖了其他第三方库提供的proto定义,不要使用方案三,否则会出现找不到依赖proto的编译错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:21:03