第2章:Gradle 依赖配置与版本选择

迁移到 DataStore 的第一步是正确配置 Gradle 依赖。目前 DataStore 提供两种实现:Preferences DataStore 和 Proto DataStore,它们的依赖声明、版本选择以及对 Kotlin 协程与 Flow 的依赖要求略有不同。本章将详细说明如何正确声明依赖、处理版本兼容性以及避免常见的依赖冲突。

2.1 Preferences DataStore 依赖

Preferences DataStore 以键值对形式存储数据,无需定义 Schema。只需添加以下单一依赖即可使用:

// build.gradle (Module: app)
dependencies {
    // Preferences DataStore
    implementation("androidx.datastore:datastore-preferences:1.0.0")
}

若项目中已启用 Kotlin 1.6+,该依赖会自动拉取 kotlinx-coroutines-core 与 kotlinx-serialization(用于序列化),但建议显式声明协程版本以保证可控性(参见第 2.4 节)。

2.2 Proto DataStore 依赖

Proto DataStore 基于 Protocol Buffers,需要同时引入 datastore-core 和 protobuf 相关依赖:

// build.gradle (Module: app)
dependencies {
    // Proto DataStore 核心
    implementation("androidx.datastore:datastore-core:1.0.0")

    // Protocol Buffers 运行时
    implementation("com.google.protobuf:protobuf-javalite:3.21.12")

    // 可选:使用 Kotlin 序列化器时可添加 protobuf-kotlin-lite
    // implementation("com.google.protobuf:protobuf-kotlin-lite:3.21.12")
}

此外,需要在项目根目录的 build.gradle 中配置 protobuf 插件以自动生成 Java/Kotlin 数据类:

// build.gradle (Project)
plugins {
    id("com.google.protobuf") version "0.9.4" apply false
}

// build.gradle (Module: app)
plugins {
    id("com.google.protobuf")
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.21.12"
    }
    generateProtoTasks {
        all().forEach { task ->
            task.builtins {
                create("java") {
                    option("lite")
                }
            }
        }
    }
}

2.3 版本兼容性矩阵

下表列出主流依赖组合的兼容性,建议在迁移时参考:

DataStore 版本 最低 Kotlin 版本 所需 Coroutines 版本 Proto 运行时版本 AGP 建议版本
1.0.0 1.6.0 1.6.4 3.21.9+ 7.2+
1.0.0-rc02 1.5.31 1.5.2 3.19.6 7.0
1.0.0-alpha08 1.5.10 1.5.0 3.18.1 4.2
提示:若使用 Proto DataStore,请确保 proto 插件版本与 protoc 版本一致,否则可能导致序列化错误。

2.4 Kotlin 协程与 Flow 依赖

两种 DataStore 都基于 Kotlin 协程和 Flow 实现异步读写。即使 DataStore 本身已经间接引入了协程库,仍建议显式声明以下依赖以确保版本可控:

// 协程核心与 Android 调度器
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

// Flow 相关(DataStore API 已包含,但若需操作 Lifecycle-aware 数据)
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2") // 仅在转换 DataStore Flow 到 LiveData 时需要

若项目中同时使用 Room 或其他协程框架,请核对 coroutines 版本以避免 NoSuchMethodError。推荐统一使用同一版本号。

2.5 选择指南与 SVG 流程图

决定使用哪种 DataStore 是依赖配置的第一个关键分支。下面的流程图帮助团队快速决策,并明确对应的依赖声明路径:

DataStore 依赖选择流程 选择 DataStore 类型 需要强类型 数据模型? Proto DataStore + datastore-core Preferences DataStore datastore-preferences 添加协程 / Flow 依赖 版本兼容性 参考第 2.3 节表格 避免版本冲突
常见错误:版本不兼容时通常抛出 java.lang.NoClassDefFoundError 或 kotlinx.coroutines.CancellationException。请务必使用矩阵表中列出的版本组合,并清理 Gradle 缓存(./gradlew cleanBuildCache)。
要点总结:
  • Preferences DataStore 只需一个依赖 datastore-preferences。
  • Proto DataStore 需要 datastore-core、protobuf-javalite 以及 protobuf 插件。
  • 始终显式声明 kotlinx-coroutines-core 与 kotlinx-coroutines-android 版本。
  • 参考兼容性矩阵,避免混用 alpha 与稳定版依赖。