Android 数据存储之DataStore与MMKV该怎么选择
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 版权协议,转载请附上原文链接和本声明。