android-MMKV 高效储存

简介

MMKV是由Tencent团队开源出来的数据存储方案,基于 mmap 内存映射的 key-value 组件,其方式与sharedpreferences 相似,在Android开发中可以使用MMKV完全替代sharedpreferences,MMKV底层序列化/反序列化使用 protobuf 实现,不动protobuf自行了解.MMKV 支持全平台使用,底层由C完成.可以根据自己需求更改源文件进行打包使用.

为什么使用MMKV而放弃SharedPreferences?

先简单介绍下sharedpreferences.

适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等.

核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息,SharedPreferences数据总是存储在/data/data//shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。

SharedPreferences创建需要指定对应的读写权限模式:

  1. Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写.
  2. Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写.
  3. Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写.
  4. Context.MODE_MULTI_PROCESS: 指定该SharedPreferences 数据能被其他进程读,写.

方式2,3 模式的意思是对外开放了本应用中文件的读写权限,非常不安全,已被废弃,Google建议使用FileProvider文件共享.

方式4:
MODE_MULTI_PROCESS

说得很清楚:该模式在很多Android版本已经不支持了(废弃),而且没有任何进程并发修改机制.

所以现在使用SharedPreferences 就只能在本应用类储存写小的数据,而且效率不太高.

MMKV VS SharedPreferences读写效率

官网性能对比

效率对比

上图引用官网图,而且只是单进程读写性能,高低立见!

MMKV 优点

  1. 由上面性能对比,读写效率方面远胜于其他数据储存方案.
  2. 一套存储方案全平台适用,由于底层用c编写,并且源码开发,支持Android /iOS /macOS / Windows 平台.
  3. 使用protobuf进行数据序列化,性能和储存空间的占用远胜于其他方案.
  4. 针对于Android方面简化了使用,可以抛弃很多冗余代码,并且支持SharedPreferences 数据储存的转移方案.
  5. 支持多进程访问,并使用了 AES CFB-128 算法来进行数据加密/解密.

MMKV Android方面使用

  • gradle 依赖引入
dependencies {
    implementation 'com.tencent:mmkv:1.0.18'
    // replace "1.0.18" with any available version
}
  • 初始化MMKV,可以在Application 或者activity中初始化MMKV
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //储存地址
    String rootDir = MMKV.initialize(this);
}

注意initialize方法有另外两个重载方法,可以指定储存路径与指定加载器.

源码:

// call on program start  
public static String initialize(Context context) {
    String root = context.getFilesDir().getAbsolutePath() + "/mmkv";
    return initialize(root, null);
}

public static String initialize(String rootDir) {
    return initialize(rootDir, null);
}

public static String initialize(String rootDir, LibLoader loader) {
    if (loader != null) {
        if (BuildConfig.FLAVOR.equals("SharedCpp")) {
            loader.loadLibrary("c++_shared");
        }
        loader.loadLibrary("mmkv");
    } else {
        if (BuildConfig.FLAVOR.equals("SharedCpp")) {
            System.loadLibrary("c++_shared");
        }
        System.loadLibrary("mmkv");
    }
    MMKV.rootDir = rootDir;
    jniInitialize(MMKV.rootDir);
    return rootDir;
}

  • 简单的使用
MMKV kv = MMKV.defaultMMKV();
kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");

kv.encode("int", Integer.MIN_VALUE);
int iValue = kv.decodeInt("int");

kv.encode("string", "Hello from mmkv");
String str = kv.decodeString("string");

以上是MMKV的基本使用,当然MMKV有其他更高级的使用方法,其他使用方法在官网上都有详细介绍.

小结

针对于Android 平台 MMKV 完全可以替代sharedpreferences,MMKV 2015年开始使用在微信上,2018年开源,至今github上使用start数只有七千左右,项目使用的并不是很多.或许很多项目满足于Android原生的数据储存,但是在性能优化上完全可以考虑用MMKV替换项目中的sharedpreferences.

posted @ 2023-02-07 10:44  年年糕  阅读(427)  评论(0编辑  收藏  举报