Skip to content
guoling edited this page Dec 21, 2020 · 2 revisions

FAQ

  • 什么情况下应该使用 MMKV?
    如果你遇到以下场景,你应该选择 MMKV:

    • 你的 iOS/Android App 需要一个通用的 key-value 存储组件;
    • 你担心频繁写入的性能;
    • 跨进程访问往往导致你的 Android App 卡顿(ANR).
  • MMKV 是否支持 Swift?
    支持,MMKV 兼容 Swift,具体用法见 demo

  • MMKV 是否支持 Kotlin?
    支持,MMKV 在 Java 和 Kotlin 下都能完美运行,具体用法参见 demo

  • MMKV 的加密用了哪种算法?
    MMKV 使用了 AES CFB-128 算法来加密/解密。具体是采用了 OpenSSL(1.1.0i 版)的实现。我们选择 CFB 而不是常见的 CBC 算法,主要是因为 MMKV 使用 append-only 实现插入/更新操作,流式加密算法更加合适。

  • MMKV 有哪些限制?
    MMKV 在大部分情况下都性能强劲,key/value 的数量和长度都没有限制。然而 MMKV 在内存里缓存了所有的 key-value,在总大小比较大的情况下(例如 100M+),App 可能会爆内存,触发重整回写时,写入速度也会变慢。支持大文件的 MMKV 正在开发中,有望在下一个大版本发布。

  • MMKV 对 FD(文件描述符)的使用情况如何?
    MMKV 背后是一个被 mmap 映射到内存的文件。另外 MMKV 还使用了一个元数据文件来记录 CRC32 摘要,存储加密初始向量(IR),以及用来同步多进程操作。所以每个 MMKV 实例会使用两个 FD。如果你担心 FD 占用,你可以调用close()函数——如果你确定该实例短期内不会再用到的话。注意close()后不应该再访问该对象,后续要用的话,必须重新初始化该实例。

  • 如何备份 MMKV 的数据(并恢复/迁移到另一台设备)?
    如上所述,每个 MMKV 用了一个数据文件和一个元数据文件。所以你必须备份 MMKV 文件本身,以及关联的*.crc元数据文件。

  • iOS 版 MMKV 支持多进程读写吗?
    MMKV 从 v1.1.0 开始支持 iOS 多进程读写。

  • Android 版 MMKV 的 Ashmem 是什么东西,什么情况下应该用这个模式?
    Ashmem MMKV 是 Android 里的一个 memory-only 的多进程共享 key-value 存储,在一个 App 的所有进程退出后,会自动消失。她不使用任何文件来做存储,因此很适合在一个 App 内的众多进程之间共享敏感数据

  • 在某些 Android 设备上(API level 19)遇到java.lang.UnsatisfiedLinkError。这是怎么回事,我应该采取什么措施?
    API level 19 的 Android 设备在安装、更新 APK 时,可能会遗漏 libmmkv.so。针对这个问题,已有专门的开源库 ReLinker 解决。你可以使用这个开源库,结合调用 MMKV.initialize(String rootDir, LibLoader loader) 来加载 MMKV。 可以参考 mmkvdemo 里的示例代码.

  • 我可以关掉或重定向 MMKV 的日志吗?
    是可以的。MMKV 在 v1.0.17 之后添加了相应的 API,具体可以参考 mmkvdemo 里的示例代码。

  • 为什么我的 MMKV 没能在多进程间共享数据
    最常见的错误是没有使用多进程模式访问这个 MMKV 实例。某些情况下(Android),你以为App里没有多进程,实质上还是创建了多进程,例如 Service、重复打开App、同一个进程对象被创建多次,等等。
    有一个最简单的排查办法,就是将所有访问此 MMKV 实例的地方,都用上MULTI_PROCESS多进程模式,看看问题是否解决。

  • 为什么 MMKV 在 App 重启后丢失数据
    有几个可能的原因:

    1. 没有使用多进程模式访问这个 MMKV 实例,如上文所述。最简单的排查办法,就是将所有访问此 MMKV 实例的地方,都用上MULTI_PROCESS多进程模式,看看问题是否解决。
    2. 文件损坏。通常发生在设备意外重启后,例如设备断电、用户强制关机、摔手机等。你可以设置 recover 策略;或在合适的时机手工调用sync(),将内存数据同步到文件。
    3. MMKV 有未知的 bug。当上述方法都尝试后,问题还在,可以提一个 issue。
  • 为什么 MMKV 会 crash
    有几个可能的原因:

    1. 没有使用多进程模式访问这个 MMKV 实例,如上文所述。最简单的排查办法,就是将所有访问此 MMKV 实例的地方,都用上MULTI_PROCESS多进程模式,看看问题是否解决。
    2. MMKV 有未知的 bug。当上述方法都尝试后,问题还在,可以提一个 issue。
Clone this wiki locally