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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:39:05