You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:25:19