一、一句话总结
- 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,异步、类型安全、响应式、官方、不支持多进程