Android迁移Gradle Kotlin DSL过程中Protobuf配置报错问题
解决方案
报错根因
Android Gradle 插件的 android.sourceSets 块返回的是 Android 自定义 SourceSet 类型,与 Protobuf 插件 proto() 扩展方法要求的 Gradle 原生 SourceSet 类型不匹配,导致方法匹配失败。
修复步骤
- 首先修正配置位置:将 proto 目录配置从
android {}块内移出,直接在脚本顶层配置项目原生 SourceSet - 其次修正写法错误:
proto{}块内不存在java属性,直接调用srcDir指定 proto 文件路径即可
修改后的对应配置示例:
import com.google.protobuf.gradle.* plugins { id("com.android.library") kotlin("android") id("com.google.protobuf") } android { // 其他android配置保留 ... sourceSets { getByName("main") { // 这里只保留android相关的源集配置,不要放proto配置 java.srcDirs("src/main/java") } } } // 顶层配置proto源集,直接调用原生SourceSet的扩展方法 sourceSets { getByName("main") { proto { srcDir("src/main/java/com/...") } } } // 后面的protobuf配置保留即可 protobuf { protoc { artifact = "com.google.protobuf:protoc:3.12.4" } generateProtoTasks { all().forEach { task -> task.plugins { create("java") { option("lite") } } } } }
备选兼容写法
如果习惯将源集配置统一放在 android 块内,可以通过显式获取原生 Java SourceSet 的方式兼容:
android { sourceSets { getByName("main") { java.sourceSet.proto { srcDir("src/main/java/com/...") } } } }
内容的提问来源于stack exchange,提问作者David I. Lipkind
相关产品推荐
相关产品推荐

