Android 数据存储之DataStore与MMKV该怎么选择

本文首发地址 https://h89.cn/archives/342.html
最新更新地址 https://gitee.com/chenjim/chenjimblog

核心设计

  • MMKV
    基于 mmap 内存映射技术,通过将文件直接映射到内存实现快速读写,底层使用 Protobuf 序列化数据。
    写入操作直接由操作系统异步回写到磁盘,避免 I/O 阻塞主线程。
    原生支持 多进程 并发读写(通过文件锁机制)。
  • DataStore
    属于 Android Jetpack 组件,分为 PreferencesDataStore(键值对)和 ProtoDataStore(类型安全对象)。
    基于 Kotlin 协程和 Flow 实现异步操作,数据变更通过事务保证一致性。
    不支持多进程,需自行实现跨进程同步。

性能表现

  • 写入速度
    MMKV 因 mmap 机制优势明显,写入耗时显著低于 DataStore。例如,单次写入 500B 数据时,MMKV 耗时约 2ms,而 DataStore 可达 79ms(同步模式下)。
    DataStore 的异步操作在协程中执行,主线程响应更流畅,但实时性略逊于 MMKV。
  • 读取速度
    MMKV 直接从内存读取,速度接近内存操作;DataStore 需解析 Flow 数据流,稍慢于 MMKV。
  • 内存占用
    MMKV 一次性加载全部数据到内存,大文件可能引发 OOM;DataStore 按需加载,内存占用更可控。

功能特性

  • 数据类型支持
    MMKV:支持基本类型和简单对象,无类型安全检查。
    DataStore(ProtoDataStore):通过 Protobuf 支持复杂对象,编译时类型校验更安全。
  • 数据迁移
    DataStore 提供从 SharedPreferences 自动迁移的工具;MMKV 需手动迁移。
    加密支持
    MMKV 支持 AES 加密;DataStore 需自行实现加密逻辑。

稳定性与风险

  • 数据丢失风险
    MMKV:极端崩溃或断电可能导致部分数据未持久化(依赖操作系统回写)。
    DataStore:事务机制保证数据一致性,崩溃时回滚到完整状态。
  • 卡顿与 ANR
    MMKV 大文件加载或写入时可能卡顿;DataStore 异步操作天然避免主线程阻塞。

适用场景

  • 选择 MMKV 的情况
    高频读写(如聊天记录、实时配置);
    多进程数据共享需求;
    对实时性要求高且能接受低概率数据丢失风险。
  • 选择 DataStore 的情况
    新项目或已使用 Kotlin 协程;
    需要类型安全或复杂数据模型;
    优先考虑数据一致性和长期维护性(Google 官方支持)。

总结

维度 MMKV DataStore
性能 读写速度快,适合高频场景 异步安全,主线程流畅性更佳
多进程支持 原生支持 不支持
类型安全 不支持 支持(ProtoDataStore)
数据迁移 需手动迁移 支持自动迁移
适用项目 老项目或高性能需求 新项目或 Jetpack 生态优先

建议根据具体需求选择:高频写入/多进程选 MMKV,类型安全/长期维护选 DataStore。

参考资料
https://www.n.cn/search/59c1220a0e8f41cc8fe48ee5810a97f5


本文链接:Android 数据存储之DataStore与MMKV该怎么选择 - https://h89.cn/archives/342.html

版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。

标签: none

添加新评论