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,异步、类型安全、响应式、官方、不支持多进程
相关推荐
用户69371750013841 小时前
2026,程序员的时代拐点到了
android·前端·后端
浪潮IT馆3 小时前
Android Studio 非最新版本下载安装教程
android·ide·android studio
xiaozongt19894 小时前
MasterGo + Claude Code 生成 Android 布局:完整实践指南
android
Anhty5 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
2501_915909067 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
狗凯之家源码网8 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
ZHOUPUYU8 小时前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
JMchen8 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
ZHOUPUYU9 小时前
PHP 8.2 的核心高级特性,包括只读类、类型系统增强
android·性能优化·php
ZHOUPUYU9 小时前
PHP 8.0 高级技术实战:从新特性到性能优化
android·性能优化·php