【问题标题】:How to setup protobuf in kotlin/android studio?如何在 kotlin/android studio 中设置 protobuf?
【发布时间】:2022-12-10 04:02:25
【问题描述】:

第一次使用 protobuf,所以按照谷歌的说明,我将所有的 .protos 放在我的 android studio 项目的 protos 文件夹中。我知道 .proto 文件设置正确。我使用以下命令编译该文件夹中的文件:

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

这会生成一堆看起来像我应该得到的 kotlin 和 java 文件。然而,android studio 会抛出大量错误,并且似乎不喜欢这些文件中的大部分代码。

所以我的问题是我需要做一些额外的设置,在 gradle 文件中引入依赖项?我看到了一个这样的例子,但它似乎只与使用 gradle 进行编译的插件相关——因为我是从命令行编译的,所以我认为我不需要那个?

【问题讨论】:

  • 您不会发布任何创建的代码、使用它的代码或生成的错误。没有任何信息,我们真的无法提供帮助。

标签: android kotlin gradle protocol-buffers


【解决方案1】:

不能将 *.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 上不会遵循。你无权选择。
  • 我试过了,我得到了 > Could not find method option() for arguments [lite] on extension 'kotlin' of type org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension. 我正在使用 gradle 7.4,知道吗?
【解决方案2】:
猜你喜欢
  • 2023-02-10
  • 2022-11-23
  • 2016-03-10
  • 2017-12-22
  • 2018-03-21
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多