Androidx Proto 数据存储 gradle 设置

Androidx Proto datastore gradle setup

我正在尝试使用 Kotlin DSL (build.gradle.kts) 在 gradle 中配置的 protobuf 支持来获取新的 (alpha) android 数据存储。第一次尝试不会从存在的 xxx.proto(虚构名称)文件生成任何 java 源 类。 protobuf 插件正在生成正确的 android 任务,但是 运行 它们什么也不生成,所以显然默认设置没有找到我的初始 xxx.proto 文件所在的目录。现有文档是精简 gradle 设置,尤其是对于 Kotlin Gradle DSL(到目前为止 google 中的大多数 gradle 文档都是针对 groovy),以及我最初的尝试定义 xxx.proto 文件的位置无效。

是否有人拥有或曾见过使用 Kotlin (build.gradle.kts) 为 .proto 文件指定自定义源目录的 gradle 配置?

经过一些实验和挣扎后它可以正常工作,但涉及黑客攻击。如果有人可以提出改进建议,我们将不胜感激。如果这很有用,这里是工作设置中的配置片段。模块是具有 android、ios64 和 jvm 目标的 kotlin 1.4.21-2 多平台,还有更多计划。它具有源目录的 KMP 默认设置:

.proto 文件位于 src/androidMain/proto 子目录中。

build.gradle.kts 片段如下。所有更改都在 android 块中,当然除了插件:

plugins {
    id("com.android.library")
    kotlin("multiplatform")
    id("kotlinx-atomicfu")
    kotlin("plugin.serialization") version Versions.kotlinVersion
    id("com.google.protobuf") version "0.8.14"
}
...
kotlin {
... no changes here
}
...
android {
    ...
    sourceSets {
        ...
        getByName("main") {
            manifest.srcFile("src/androidMain/AndroidManifest.xml")
            java.srcDirs("src/androidMain/kotlin")
            assets.srcDirs(File("src/commonMain/resources"))

            withGroovyBuilder {
                "proto" {
                   "srcDir" ("src/androidMain/proto")
               }
            }
        }
    }
    protobuf {
        protoc {
            artifact = "com.google.protobuf:protoc:4.0.0-rc-2"
        }
        plugins {
            id("javalite") { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
        }
        generateProtoTasks {
            all().forEach { task ->
                task.builtins {
                    id("java") {
                        option("lite")
                    }
                }
                task.plugins{
                }
            }
        }
    }
    dependencies {
        api("com.google.protobuf:protobuf-javalite:4.0.0-rc-2")
        implementation("androidx.datastore:datastore:1.0.0-alpha05")
        ...
    } 
}

请注意 android 源集中的 withGroovyBuilder hack - 插件需要 srcdir 定义才能找到我拥有的 .proto 文件,但在当前版本的插件中我不能'不知道正确的 Kotlin DSL 语法。似乎插件需要定义一个 Kotlin 扩展函数来使它更好地工作。

如果数据存储可以使用 kotlinx.serialization 提供的 protobuf 序列化而不是需要这些东西,并且跳过 gradle 中的这个 java 代码生成步骤,那就太好了] 全部一起。但我确信那是在路上...

无论如何,如果有人有改进等,请提前致谢...