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,异步、类型安全、响应式、官方、不支持多进程
相关推荐
阿巴斯甜2 小时前
MVVM和MVI的区别:
android
Fate_I_C2 小时前
Android Navigation Fragment 导航实战
android·kotlin·navigation
Fate_I_C2 小时前
Adroid Data Binding数据绑定对比(findViewXX、ButterKnife)
android·kotlin·databinding
黑心的奥利奥3 小时前
WeeX跨平台框架,自定义安卓平台MarkDown文本渲染组件高度跟随内容自适应实现思路探索
android
KIHU快狐3 小时前
快狐KIHU|110寸壁挂触控一体机G+G电容屏安卓系统汽车展厅查询展示
android·python·汽车
Fate_I_C4 小时前
Android DataBinding数据绑定表达式、双向绑定
android·kotlin·databinding
csj505 小时前
安卓基础之《(29)—消息机制与异步任务》
android
张风捷特烈5 小时前
状态管理大乱斗#02 | Bloc 源码全面评析
android·前端·flutter
untE EADO6 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql