Android開發之MMKV的不足以及線下調試工具

作者:舞影凌風
轉載地址:https://juejin.cn/post/6887800985272451086

開題

毋容置疑,MMKV是一款非常優秀的輕量級存儲框架,像百度、頭條、快手等應用都線上引用了,質量和性能上有微信實踐做保證。在Android上MMKV主要用來替換系統的sp,用來解決sp性能 + 不支持多進程問題,一些博客平臺對原理做了分析,我們今天就來談談MMKV的一些設計缺陷,或者說改進點。

存在的問題

0x1 數據存儲分了兩個文件,數據+校驗

先來介紹下MMKV的存儲結構,分了兩個文件,一個數據文件,存儲結構如下:

一個校驗文件,crc結尾,存儲結構如下:

(新版本擴展了一些字節,圖是老的)

這種設計最直接問題就是佔用空間變大了很多,如下面的例子,只存儲了一個字段,但是爲了方便MMAP映射,磁盤直接佔用了8k的存儲,官方宣稱的protobuf存儲(可變長整型) 也省不回這個大小

另一方面就是操作兩個文件按理說出錯的概率會變大, 微信線上錯誤率很低問題不大,但是存儲在一個文件頭上其實是更好的設計,不知道官方是爲了向下兼容還是有其他考慮

0x2 數據存儲階段把類型擦除了

MMKV都是按字節進行存儲的,實際寫入文件把類型擦除了,這也是MMKV不支持getAll的原因,雖然說getAll用的不多問題不大,但是MMKV因此就不具備導出和遷移的能力了,比如說,以後出了更優秀的存儲框架,是沒有辦法直接從MMKV批量遷移到新框架的,除非代碼裏面寫死一個個key遷移

我覺得比較好的方案是每次存儲,多用一個字節來存儲數據類型,這樣佔用的空間也不會大很多,但是具備了更好的可擴展性

0x3 不方便調試

官方目前支持了5個平臺,Android、iOS、Win、MacOS、python,但是沒有提供解析數據的工具,數據文件和crc都是字節碼,除了中文能看出一些內容,直接查看還是存在大量亂碼。比如線上出了問題,把用戶的存儲文件撈上來,還得替換到系統目錄裏,通過代碼斷點去看,這也太不方便了。

敝人開發了一個MAC的工具(爲什麼不支持win? 只有mac本,也沒精力維護多端)來調試MMKV的文件,支持以上五個平臺產生的數據文件,使用也很簡單,直接拖入數據文件和crc文件就行。

界面預覽

加載完成後還需要自己手動選擇下類型,還是類型擦除的問題,不能直接讀取出結果

結束

看到這裏,你是不是明白了這篇文章的重點。_

希望各位大佬 star支持一下,能貢獻代碼就更棒了

推薦
MMKV框架原理解密,MMKV如何利用mmap函數實現儲存優化100倍
MMKV原理解析之路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章