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

Android Studio Giraffe配置Protobuf遇构建错误求助

问题1:版本属性不存在错误

错误原因

模块protobuf配置里用了rootProject.ext["3.21.2"]这类写法,但rootProject.ext中根本没定义名为"3.21.2"的属性——这是把版本号当成了属性名,逻辑完全搞反了。正确做法是先在项目级定义版本变量,再引用变量名,或者直接写死版本号。

修复方案

步骤1:修改项目级build.gradle.kts

在根目录的项目配置文件中添加版本变量定义:

plugins {
    id("com.android.application") version "8.1.4" apply false
    id("org.jetbrains.kotlin.android") version "1.8.10" apply false
    id("com.google.protobuf") version "0.8.15" apply false
}

// 定义版本变量
rootProject.ext.set("protobufVersion", "3.21.2")
rootProject.ext.set("grpcJavaVersion", "1.47.0")
rootProject.ext.set("grpcKotlinVersion", "1.3.0")

步骤2:修改模块级build.gradle.kts的protobuf配置

将错误的版本引用改为变量:

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:${rootProject.ext["protobufVersion"]}"
    }
    plugins {
        id("java") {
            artifact = "io.grpc:protoc-gen-grpc-java:${rootProject.ext["grpcJavaVersion"]}"
        }
        id("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:${rootProject.ext["grpcJavaVersion"]}"
        }
        id("grpckt") {
            artifact = "io.grpc:protoc-gen-grpc-kotlin:${rootProject.ext["grpcKotlinVersion"]}:jdk8@jar"
        }
    }
    generateProtoTasks {
        all().forEach {
            it.plugins {
                id("java") { option("lite") }
                id("grpc") { option("lite") }
                id("grpckt") { option("lite") }
            }
            it.builtins {
                id("kotlin") { option("lite") }
            }
        }
    }
}

如果想快速解决,也可以直接写死版本号(不推荐,但能快速生效):

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.21.2"
    }
    plugins {
        id("java") { artifact = "io.grpc:protoc-gen-grpc-java:1.47.0" }
        id("grpc") { artifact = "io.grpc:protoc-gen-grpc-java:1.47.0" }
        id("grpckt") { artifact = "io.grpc:protoc-gen-grpc-kotlin:1.3.0:jdk8@jar" }
    }
    // generateProtoTasks部分保持不变
}

问题2:sourceSets的main标红错误

错误原因

你用的是Kotlin DSL,main()是Groovy DSL的语法,Kotlin DSL中不能把main当函数调用,语法规则完全不同。

修复方案

如果需要配置Proto文件目录,正确的Kotlin DSL写法如下:

android {
    // 其他配置...
    sourceSets {
        // 方式1:简洁写法
        main {
            proto {
                srcDir("src/main/proto") // 默认目录就是这个,可省略
            }
        }
        // 方式2:标准写法
        named("main") {
            proto {
                srcDir("src/main/proto")
            }
        }
    }
}

注意:如果你的proto文件放在默认的src/main/proto目录下,不需要额外配置sourceSets,插件会自动识别。


额外优化建议
  1. 移除重复依赖:你的dependencies里重复添加了com.google.protobuf:protobuf-kotlin:3.21.2,删掉其中一个。
  2. 版本对齐:确保Protobuf、gRPC版本互相兼容,当前配置的版本组合是兼容的,可保留。
  3. 升级插件:com.google.protobuf插件可升级到最新稳定版(如0.9.4),适配Android Studio Giraffe。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:57