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,异步、类型安全、响应式、官方、不支持多进程
相关推荐
小田的博客13 小时前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆14 小时前
Android智能猫砂盆视频加载慢卡顿问题分析
android
只会cv的小前端15 小时前
七巧低代码服务端脚本使用方法
android·低代码·rxjava
16 小时前
Android 自定义 View 实战:从零打造工业级全向摇杆控件(OmniJoystickView)
android·kotlin·自定义view·摇杆控件
雨白16 小时前
深入理解 Kotlin 协程 (十一):以逸待劳,探秘 select 多路复用与并发安全策略
android·kotlin
hunterandroid18 小时前
[Android 从零到一] Android 深度链接与 App Links:从 URI Scheme 到可验证的应用跳转
android
我命由我1234520 小时前
Jetpack Compose - Material Design 断点范围、WindowSizeClass、针对不同屏幕尺寸创建预览、四类导航栏
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
执明wa21 小时前
Android 开发中的设计模式入门:六大设计原则
android·设计模式
松仔log1 天前
Java中级——组合和继承
android·java·开发语言
我命由我123452 天前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime