Skip to content
guoling edited this page Sep 2, 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 正在开发中,有望在下一个大版本发布。

  • 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