MMKV 和DataStore 的区别:

一、一句话总结

  • MMKV:腾讯开源,超高性能、同步、简单、支持多进程、适合高频读写
  • DataStore:Google Jetpack,官方、异步、协程 + Flow、类型安全、适合 Compose / 响应式

性能:MMKV >> DataStore > SharedPreferences

二、核心区别(一眼看懂)

1. 底层原理

  • MMKV:mmap 内存映射 + 增量写入 + Protobuf

    • 写内存≈写磁盘,几乎无 IO 开销
    • 崩溃不丢数据
  • DataStore:异步文件 IO + Protobuf

    • 用协程 + Flow,避免阻塞主线程

2. 同步 / 异步

  • MMKV:同步 API(get/put 直接返回)

    • 速度极快,主线程直接用也不卡
  • DataStore:纯异步(必须用 suspend/Flow)

    • 不能直接在主线程取值,必须协程

3. 多进程

  • MMKV:原生支持多进程安全(微信在用)
  • DataStore:不支持多进程,多进程读写会丢数据

4. 类型安全

  • MMKV:弱类型(和 SP 一样,putInt/putString)

  • DataStore:强类型安全

    • Preferences:TypedKey
    • Proto:严格 Protobuf schema

5. 数据监听

  • MMKV:无内置监听,自己封装
  • DataStore:天然 Flow 监听,数据变了自动通知 UI

6. 加密

  • MMKV:内置 AES 加密,一行代码开启
  • DataStore:无内置加密,要自己加

7. 依赖 / 包大小

  • MMKV:第三方库,体积很小(~30KB)
  • DataStore:官方 Jetpack,无额外第三方依赖

三、优缺点对比(极简版)

MMKV 优点

速度极快(比 SP 快 100~200 倍)

同步 API,用起来和 SP 一样简单

支持多进程(跨进程共享配置)

内置加密、崩溃安全、增量写入

迁移 SP 成本极低

MMKV 缺点

❌ 弱类型,写错 key / 类型不报错

❌ 无内置监听,需自己封装

❌ 第三方依赖(非官方)

DataStore 优点

Google 官方 Jetpack,长期维护

异步 + Flow,完美适配 Compose/MVI

类型安全,编译期检查

事务原子性(要么全成功,要么全回滚)

天然响应式,数据变化自动更新 UI

DataStore 缺点

性能比 MMKV 慢一截

纯异步,必须协程,代码稍繁琐

不支持多进程

❌ 无内置加密

四、适用场景(直接照着选)

选 MMKV 的场景

  • 高频读写(比如每帧、循环、倒计时、埋点)
  • 多进程 App(有主进程 + 推送进程 + 后台进程)
  • 简单配置、用户设置、缓存 KV
  • 不想写协程,要同步直接取值
  • 从 SharedPreferences 迁移

选 DataStore 的场景

  • Compose + MVI/MVVM 项目(响应式 UI)
  • 需要类型安全、减少运行时错误
  • 需要监听数据变化自动更新 UI
  • 团队强依赖 Jetpack,不想用第三方库
  • 无多进程需求

五、代码示例(直观对比)

MMKV(同步,简单)

kotlin

kotlin 复制代码
// 初始化
MMKV.initialize(context)
val mmkv=MMKV.defaultMMKV()

// 写入
mmkv.putString("name", "Tom")
mmkv.putInt("age", 18)

// 读取(直接拿,不用协程)
val name=mmkv.getString("name", "")

DataStore(异步,Flow)

kotlin

scss 复制代码
// 定义Key
val nameKey = stringPreferencesKey("name")

// 写入(必须协程)
CoroutineScope(Dispatchers.IO).launch {
    context.createDataStore(name = "settings").edit {
        it[nameKey] = "Tom"
    }
}

// 读取+监听(Flow,Compose直接collect)
val nameFlow: Flow<String> = context.createDataStore(name = "settings").data
    .map { it[nameKey] ?: "" }

六、终极结论(你项目怎么选)

  • 简单、高性能、多进程、不想写协程 → MMKV
  • Compose、MVI、响应式、类型安全、官方生态 → DataStore

可以混用:

  • 高频 / 多进程配置用 MMKV
  • UI 相关、用户偏好、需要监听的用 DataStore

七、面试背诵版

  • MMKV :mmap + 增量写入,同步、超快、多进程、弱类型、第三方
  • DataStore :协程 + Flow,异步、类型安全、响应式、官方、不支持多进程
相关推荐
程序员陆业聪36 分钟前
Compose Strong Skipping Mode 的真相:它并不会让你的类型变 Stable
android
shaoming37765 小时前
浏览器动作开发:地址栏图标点击事件、弹出页面设计
android·mysql·adb
赏金术士5 小时前
Kotlin 协程与挂起函数(Coroutines & suspend)入门到实战
android·开发语言·kotlin
泡泡以安8 小时前
Unidbg学习笔记(十三):固定随机干扰项
android·逆向
泡泡以安8 小时前
Unidbg学习笔记(十六):Console Debugger
android·逆向
赏金术士8 小时前
Room + Flow 完整教程(现代 Android 官方方案)
android·kotlin·room·compose
泡泡以安8 小时前
Unidbg学习笔记(八):文件系统层补环境
android·逆向
泡泡以安8 小时前
Unidbg学习笔记(六):补环境的思维框架
android·逆向
通往曙光的路上8 小时前
mysql2
android·adb
木易 士心9 小时前
会见SDK文档
android