如何在Kotlin/Android Studio中设置protobuf?

7

第一次使用protobuf,所以我按照Google的说明,在我的Android Studio项目中放置了所有的.proto文件到一个名为protos的文件夹中。我知道这些.proto文件已经正确设置。我使用以下命令从该文件夹编译这些文件:

protoc -I=. --java_out=. --kotlin_out=. filename.proto

这会生成一堆kotlin和java文件,看起来像是我要得到的东西。然而,Android Studio却抛出了许多错误,似乎不喜欢那些文件中的大部分代码。
所以我的问题是,设置方面需要做一些额外的事情吗?需要在gradle文件中添加一个依赖项吗?我看到了一个类似的例子,但它似乎只与使用gradle编译的插件相关——由于我是从命令行编译的,所以我认为我不应该需要那个?
1个回答

7
不能将*.proto文件添加到Java或Kotlin源目录中...
对于Android使用protobuf-lite; 配置大致如下:
plugins {
    id 'com.android.application' version '7.2.0' apply false
    id 'com.google.protobuf' version '0.8.18' apply false
}

模块build.gradle文件:

plugins {
    id 'com.android.application'
    id 'com.google.protobuf'
}

android {
    sourceSets {
        main {
            java {
                srcDirs += 'build/generated/source/proto/main/java'
            }
            kotlin {
                srcDirs += 'build/generated/source/proto/main/kotlin'
            }
            proto {
                srcDir 'src/main/proto' // default value
            }
        }
    }
}

dependencies {
    implementation 'com.google.protobuf:protobuf-javalite:3.20.1'
    implementation 'com.google.protobuf:protobuf-kotlin-lite:3.20.1'
}

还有一个protoc编译器和protoc-gen-javalite生成器可用:

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.20.1'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            java {
                option 'lite'
            }
            kotlin {
                option 'lite'
            }
        }
    }
}

另外,还可以查看 protobuf-gradle-plugin (该 Kotlin/GRPC 示例不适用于 Android)。

Firebase正在使用protobuf-javalite,这可能会导致依赖冲突。Android Java不一定与“Java”相同。option 'lite'也是性能问题。GitHub上的Kotlin示例是反模式,在Android上不应该遵循。你不能选择。 - Martin Zeitler
3
我尝试了一下,但出现了以下错误:我正在使用gradle 7.4,你有什么想法吗? - Michael
@Michael 我也在使用 Kotlin DSL,tonycodes 在这个 Github 问题上的回复 帮了我很多。 - Ari Lacenski
@MartinZeitler 这篇文章真的帮助我理解何时使用“lite”依赖项。由于您正在使用.proto文件的默认位置,因此不需要声明sourceSets。该插件文档中有记录:https://github.com/google/protobuf-gradle-plugin - Ari Lacenski
@Michael 使用task.builtins {},并将Java或Kotlin放在其中。 - Rohit gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接