kotlin - Androidx Proto 数据存储 gradle 设置

标签 kotlin gradle androidx datastore

我正在尝试使用 Kotlin DSL(build.gradle.kts)在 gradle 中配置的 protobuf 支持来获取新的(alpha)android 数据存储。第一次尝试没有从存在的 xxx.proto(虚构名称)文件生成任何 java 源类。 protobuf 插件正在生成正确的 android 任务,但运行它们不会生成任何内容,因此显然默认设置没有找到我的初始 xxx.proto 文件所在的目录。现有文档在 gradle 设置上很薄,尤其是对于 Kotlin Gradle DSL (到目前为止,谷歌的大多数 gradle 文档都是针对 groovy 的),并且我最初尝试定义 xxx.proto 文件的位置的尝试都不起作用。
是否有人拥有或曾经见过使用 Kotlin (build.gradle.kts) 为 .proto 文件指定自定义源目录的工作 gradle 配置?

最佳答案

经过一些实验和挣扎后让它工作,但涉及黑客。如果有人可以提出改进建议,将不胜感激。如果这有用,这里是工作设置中的配置片段。模块是 kotlin 1.4.21-2 多平台,具有 android、ios64 和 jvm 目标,计划更多。它具有源目录的 KMP 默认设置:
src directories
.proto 文件位于 src/androidMain/proto 子目录中。
build.gradle.kts 片段如下。所有更改都在android block ,当然插件除外:

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")
        ...
    } 
}
注意 withGroovyBuilder破解 android 源集 - 插件需要 srcdir 定义才能找到我拥有的 .proto 文件,但在当前版本的插件中,我无法找出正确的 Kotlin DSL 语法。似乎插件需要定义一个 Kotlin 扩展函数以使其更好地工作。
如果不需要这些东西,数据存储区的东西可以使用 kotlinx.serialization 提供的 protobuf 序列化,并一起跳过 gradle 中的这个 java 代码生成步骤,那就太好了。但我敢肯定,这是在路上......
无论如何,如果有人有改进等,请提前感谢...

关于kotlin - Androidx Proto 数据存储 gradle 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65569769/

相关文章:

groovy - 在一个 Gradle 任务中生成一个文件以供另一 Gradle 任务操作

java - 与 androidx.work.logger 发生不兼容的ClassChangeError

java - Android SDK 中包含哪些库?

java - 为什么某些 Java 函数能够更改不可变的 Kotlin 对象?

gradle - build.gradle和Integration.gradle之间的区别

android - 为什么我添加本地源依赖后Android Studio gradle sync持续10多分钟(无需下载)

java - Android studio重构为androidx后没有重构.java和.xml文件中的支持类

ios - 是否有与 Mockito 类似的框架用于在 Kotlin MPP 中测试共享代码或 iOS 代码?

android - 滑动 Java.lang.IllegalStateException : Cannot obtain size for recycled Bitmap: android. graphics.Bitmap@a4f3bcf[896x157] ARGB_8888

android - 如何检查一个方法是否没有被 mockk 调用?