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/
SharedPreferences创建需要指定对应的读写权限模式:
- Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写.
- Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写.
- Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写.
- Context.MODE_MULTI_PROCESS: 指定该SharedPreferences 数据能被其他进程读,写.
方式2,3 模式的意思是对外开放了本应用中文件的读写权限,非常不安全,已被废弃,Google建议使用FileProvider文件共享.
方式4:
说得很清楚:该模式在很多Android版本已经不支持了(废弃),而且没有任何进程并发修改机制.
所以现在使用SharedPreferences 就只能在本应用类储存写小的数据,而且效率不太高.
MMKV VS SharedPreferences读写效率
上图引用官网图,而且只是单进程读写性能,高低立见!
MMKV 优点
- 由上面性能对比,读写效率方面远胜于其他数据储存方案.
- 一套存储方案全平台适用,由于底层用c编写,并且源码开发,支持Android /iOS /macOS / Windows 平台.
- 使用protobuf进行数据序列化,性能和储存空间的占用远胜于其他方案.
- 针对于Android方面简化了使用,可以抛弃很多冗余代码,并且支持SharedPreferences 数据储存的转移方案.
- 支持多进程访问,并使用了 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.