gradle 在Android Studio 2023中设置Protobuf +Kotlin

xriantvc  于 2023-02-09  发布在  Android
关注(0)|答案(1)|浏览(249)

我花了几个小时在Android Studio中使用Kotlin设置Protobuf,最终目标是我的proto文件在Kotlin中编译,并且我可以在我的项目中使用它们。我在多个目录中有多个proto-file。protobuf源目录/Users/me/CLionProjects/proto-files包含4个目录,其中有proto-file。
下面是一个复制路径。这是我在互联网上找到的教程的共同努力。这可能是可怕的错误。我尝试了https://github.com/google/protobuf-gradle-plugin,但它只是看起来如此复杂的东西简单,我正在做:

  • 在文件系统的某个地方有一个包含protofiles的目录
  • 在Kotlin上创建新的Android项目
  • 在Project build.gradle中,添加id 'com.google.protobuf' version '0.9.2' apply false作为插件
  • 在模块build.gradle中,添加-〉

1.这对于依赖项:implementation 'com.google.protobuf:protobuf-lite:3.21.12'

  1. android支架内底部的sourceSets
  2. protobuf部分位于dependenciesandroid部分之间的底部。

源集:

sourceSets {
    main {
        kotlin {
            srcDirs += 'build/generated/source/proto/main/kotlin'
        }
        proto {
            srcDir '/Users/me/CLionProjects/proto-files'
        }
    }
}

原缓冲液:

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.21.12'
    }
    plugins {
        kotlinlite {
            artifact = 'com.google.protobuf:protoc-gen-kotlin:3.20.1'
        }
    }
    generateProtoTasks {
        ofSourceSet("main").forEach { task ->
            task.builtins {
                getByName("kotlin") {
                    option("lite")
                }
            }
        }
    }
}

我得到这个错误:

A problem occurred evaluating project ':app'.
> Could not find method proto() for arguments [build_cxwfo79b6zcc266x9rsqzou9f$_run_closure1$_closure8$_closure10$_closure12@203aac02] on source set main of type com.android.build.gradle.internal.api.DefaultAndroidSourceSet.
l3zydbqr

l3zydbqr1#

你的情况很好,但是,还缺少一些东西:
我将分享的gradle代码是用Kotlin编写的,以防万一。如果你能将你的成绩文件转换成Kotlin,那就太好了,如果不能,你就必须将它们转换成groovy。
1.首先要检查的是,proto文件夹是否位于正确的路径中,它应该位于

root->app->src->main->proto

1.在项目gradle中,确保已应用该插件

id("com.google.protobuf") version "0.8.15" apply false

1.在应用gradle中,请确保具备以下条件。

import com.google.protobuf.gradle.*

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.protobuf")
}

依赖关系:

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2")
    implementation("com.google.protobuf:protobuf-kotlin:3.21.2")
    implementation("io.grpc:grpc-stub:1.52.0")
    implementation("io.grpc:grpc-protobuf:1.52.0")
    implementation("io.grpc:grpc-okhttp:1.52.0")

    implementation("com.google.protobuf:protobuf-java-util:3.21.7")
    implementation("com.google.protobuf:protobuf-kotlin:3.21.2")
    implementation("io.grpc:grpc-kotlin-stub:1.3.0")

以及protobuf任务:

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:${rootProject.ext["protobufVersion"]}"
    }
    plugins {
        id("java") {
            artifact = "io.grpc:protoc-gen-grpc-java:${rootProject.ext["grpcVersion"]}"
        }
        id("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:${rootProject.ext["grpcVersion"]}"
        }
        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")
                }
            }
        }
    }
}

以下是我正在使用的版本:

ext["grpcVersion"] = "1.47.0"
ext["grpcKotlinVersion"] = "1.3.0" // CURRENT_GRPC_KOTLIN_VERSION
ext["protobufVersion"] = "3.21.2"
ext["coroutinesVersion"] = "1.6.2"

这样,您的项目就应该基于您的proto文件生成代码。
为了进一步参考,我最近构建了这个基于Kotlin+ gRPC的Android应用程序:https://github.com/wilsoncastiblanco/notes-grpc

相关问题