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,异步、类型安全、响应式、官方、不支持多进程
相关推荐
艾iYYY10 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法
xyzzklk10 小时前
解决Salesforce无法向外发送邮件
android·java·开发语言·网络·crm·salesforce·客户关系管理
修炼者12 小时前
Gradle三阶段
android
morchalen13 小时前
安卓framework学习6:Contacts 联系人 APP 日志
android
KANGBboy13 小时前
java知识四(面向对象编程)
android·java·开发语言
AD钙奶-lalala16 小时前
Android Studio新建项目默认不使用Compose模版
android·ide·android studio
故渊at18 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·系统架构·apk·打包·application·dalvik·android编译
故渊at19 小时前
第一板块:Android 系统基石与运行原理 | 第三篇:ART 与 Dalvik 运行时环境原理
android·对象模型·内存布局·运行原理·art·dalvik
私人珍藏库20 小时前
【Android】Wallcraft 3.62.0-最强4 K壁纸软件-解锁高级版
android·智能手机·app·工具·软件·多功能
GesLuck20 小时前
Node-RED企业微信发送—群文件
android·java·企业微信