Android项目中指定版本Proto DataStore无法生成类文件求助
Proto DataStore配置问题:无法生成UserPrefs类
我在Android Studio Koala(Gradle 8.7)中创建了HelloDataStore项目,刚接触Proto DataStore。跟随官方codelab配置失败后,参考NIA项目使用protoc 4.26.1、protobuf-kotlin-lite等组件,但定义user_prefs.proto后,UserPreferencesSerializer无法解析UserPrefs,build/generated目录下无source文件夹。
相关配置文件及代码如下:
libs.versions.toml
protobufPlugin = "0.9.4" #protobufPlugin = "0.9.0" #protobufPlugin = "0.9.1" protobuf = "4.26.1" #protobuf = "3.21.12" #protobuf = "3.17.3" // ... protobuf-kotlin-lite = { group = "com.google.protobuf", name = "protobuf-kotlin-lite", version.ref = "protobuf" } protobuf-java-lite = { group = "com.google.protobuf", name = "protobuf-javalite", version.ref = "protobuf" } protobuf-protoc = { group = "com.google.protobuf", name = "protoc", version.ref = "protobuf" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } protobuf = { id = "com.google.protobuf", version.ref = "protobufPlugin" }
app模块build.gradle.kts
plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.protobuf) } android { namespace = "com.wecanteen105.hellodatastore" compileSdk = 35 defaultConfig { applicationId = "com.wecanteen105.hellodatastore" minSdk = 26 targetSdk = 35 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { viewBinding = true } } // Setup protobuf configuration, generating lite Java and Kotlin classes protobuf { protoc { // artifact = libs.protobuf.protoc.get().toString() // artifact = "com.google.protobuf:protoc:3.19.4" artifact = "com.google.protobuf:protoc:3.21.9" } generateProtoTasks { all().forEach { task -> task.builtins { create("java") { option("lite") } create("kotlin") { option("lite") } } } } } //androidComponents.beforeVariants { // android.sourceSets.register(it.name) { // val buildDir = layout.buildDirectory.get().asFile // java.srcDir(buildDir.resolve("generated/source/proto/${it.name}/java")) // kotlin.srcDir(buildDir.resolve("generated/source/proto/${it.name}/kotlin")) // } //} dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.recyclerview) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.coroutines.android) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.livedata.ktx) implementation(libs.androidx.lifecycle.viewModel.ktx) implementation(libs.androidx.lifecycle.viewModel.savedstate) implementation(libs.androidx.datastore.pref) implementation(libs.androidx.datastore) // implementation(libs.protobuf.java.lite) implementation(libs.protobuf.kotlin.lite) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) }
(注:已修复原代码中task -的语法错误,改为task ->)
user_prefs.proto定义
syntax = "proto3"; option java_package = "com.wecanteen105.hellodatastore"; option java_multiple_files = true; message UserPrefs { // filter for showing / hiding completed tasks bool show_completed = 1; }
UserPreferencesSerializer代码
object UserPreferencesSerializer:Serializer<UserPrefs>
内容的提问来源于stack exchange,提问作者Shanksiscool
相关产品推荐
相关产品推荐

