一、首先看一下介绍(mmkv官方介绍)

MMKV——基于 mmap 的高性能通用 key-value 组件

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。

MMKV 源起

在微信客户端的日常运营中,时不时就会爆发特殊文字引起系统的 crash,参考文章,文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量 cell 的地方,希望新加的计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。这就需要一个性能非常高的通用 key-value 存储组件,我们考察了 SharedPreferences、NSUserDefaults、SQLite 等常见组件,发现都没能满足如此苛刻的性能要求。考虑到这个防 crash 方案最主要的诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。

MMKV 原理内存准备

通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

数据组织

数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。

写入优化

考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。

空间增长

使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。

二、在Android上的使用

String rootDir = MMKV.initialize(this);//见2.1

MMKV kv = MMKV.defaultMMKV();//见2.2

kv.encode("hello", "Hello from mmkv");//见2.3,以字符串为例。

int str = kv.decodeInt("hello");

2.1 initialize的定义

可以看到方法中调用了同名的本地方法,如下

extern "C":防止找不到本地方法,告诉编译器,保持函数名不变。因为文件是c++文件,按照c++的方式编译后会生成新的函数名,这样程序运行时会找不到本地方法。

Java_com_tencent_mmkv_MMKV_initialize:源码中采用的是静态注册本地方法,本地方法名称规则是java_包名路径_方法名。

还有一种“动态注册”本地方法方式,可以很好的解决上诉两个问题,其他文章会进行介绍,这里就不再赘述。

GetStringUTFChars:将java字符串转换成c能使用的字符串

ReleaseStringUTFChars:字符串资源的释放,c中多数需要手动释放资源这点与java有所区别。

MMKV::initializeMMKV(kstr),进入c的方法。如下:

mkPath(...),创建mmkv目录,如下:

小结,创建mmkv 目录

2.2 MMKV.defaultMMKV()

getDefaultMMKV是本地方法,进入c层。

最终调用defultMMKV();

这里面new MMKV(). c中创建MMKV类(与java中同名的类),并返回该类的地址,紧接着java中创建MMKV类,return new MMKV(handle);传入了c中对应MMKV的地址。这样Java中的类与c中的类,绑定到了一起。(这种操作是不是很熟悉,与android中的序列化parcel实现很像)。

看一下new MMKV(handle);的实现,将其缓存到nativeHandle.

2.3 kv.encode

encodeString是本地方法,注意在第一个参数。

利用reinterpret_cast,将long 地址转换成c中的MMKV。kv->setStringForKey(value, key);如下

android mmkv使用_MMKV解读相关推荐

  1. Android BLE蓝牙详细解读

    代码地址如下: http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能 ...

  2. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)

    上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启.扫描.连接.断开.连接超时...一 ...

  3. Android MMKV

    本文转自微信开发团队凌国的分享.原文 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中 ...

  4. Android bugreport 充电日志解读

    Android bugreport 充电日志解读 一条电量日志格式如下 <12>[257235.748250] healthd: battery l=67 v=3951 t=25.0 h= ...

  5. Android AsyncTask源码解读

    屡思路 1. 初始 AsyncTask AsyncTask 这个类的声明如下: public abstract class AsyncTask<Params, Progress, Result& ...

  6. android单元测试作用,Android单元测试源码解读

    Android手机操作系统是一个开源的操作系统.程序员们可以在模拟器的帮助下对其进行修改,来实现各种功能需求,满足用户的应用.在这里我们先来了解一下Android单元测试的相关内容. 在网络上找了半天 ...

  7. android增量更新详细解读

    1 增量更新的意义 a 神马是增量更新? 这个概念很早就被提出,但是目前的形式,小厂用的很少,大厂用的比较多:企鹅的QQ和微信里面都有增量更新着玩意:到底神马是增量更新? 首先增量更新主要用于新版本a ...

  8. Android中Parcel的解读

    Parcel,翻译过来是"打包"的意思.打包干什么呢?是为了序列化. 如果要在进程之间传递一个整数,很简单,直接传就是行了:如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳 ...

  9. 诺基亚n1 android 6.0,数据解读诺基亚N1:安卓平板王者之争

    1关注度:直接挑战小米平板 2015年1月7日,诺基亚N1平板电脑如期发布,这台平板电脑发布时引起了很高的关注度.除了苹果iPad,以及在国内市场上无法销售的Nexus系列,近一年来国内市场能有如此影 ...

最新文章

  1. R语言可视化斜率图、扩充图像纵横比为数据标签显示更整齐、ggrepel包来帮忙
  2. ie浏览器怎样查看html,查看IE浏览器历史记录的方法
  3. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
  4. 【Flink-未解决】 FLink TaskManager with id is no longer reachable
  5. 【Vue】—数组对象变更检测
  6. mac上virtualbox创建vm需要注意启动顺序
  7. python 穷举法 算24点(史上最简短代码)
  8. Cortex-M3 (NXP LPC1788)之PWM(脉宽调制器)
  9. vue中使用video-player和百度地图
  10. oracle查看登录失败次数,Oracle取消用户连续登录失败次数限制
  11. 命主属性是水什么意思_五行为水的命主会有怎么样的性格特点
  12. Gym Atari环境预处理Wrapper解读
  13. 感悟《疯狂的程序员》
  14. A 大吉大利,今晚吃鸡--枪械篇
  15. 浏览器主页进来是hao123
  16. 由于代理原因,联网失败的解决方法
  17. 免费WAP改变自我现状 谈四个赢利途
  18. 金蝶8.0 的安装办法
  19. 洛谷P1617 爱与愁的一千个伤心的理由
  20. catia 草绘轮廓

热门文章

  1. vs2012无法启动已配置的开发Web服务器
  2. php(wamp安装问题)
  3. 转载-隐藏在手机中的第二个操作系统
  4. (转)Apache Commons工具集简介
  5. 编程爱好者学vb还是python-高手,这是高手!推荐几个我常看的顶级技术类公众号...
  6. python3.5下载-python3.5.2官方下载
  7. 用python 爬取百度百科内容-爬虫实战(一) 用Python爬取百度百科
  8. python简单编程例子-中文方便就用中文编程!Python图形界面开发实例
  9. python简单代码编写-python读写Excel表格的实例代码(简单实用)
  10. python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历