最近不想用Android原生的SharedPreferences存储方式了,众所周知,SharedPreferences会存在卡顿的现象。也许有人想改用apply()的提交方式,但这样会存在数据丢失的现象。于是便想使用腾讯的MMKV框架存储键值对。
问题来了,当我使如下方式引入框架的时候,编译后直接提示编译失败,提示我的项目里的so文件都找不到了。
implementation 'com.tencent:mmkv:1.0.22'
分析了一下,可能与我项目中使用so库的方式有关,因为我项目中是将so库放在了其他路径下面,因为项目涉及编译不同类型的apk,编译不同的apk会引用不同的so库文件,所以我是放在了lib下面:
可以看到我项目里又根据项目的不同引用的不同的so库,最后是在buildgradle中进行统一管理的
废话不多说了,反正就是各种百度也不起作用,于是索性将mmkv框架里面的代码移植到我的项目里:
1,首先先将mmkv项目从git上clone到我本地 ,https://github.com/Tencent/MMKV
2,进行编译,可能会报错,我运行的时候发现gradle版本有问题,所以讲gradle版本升级到最新,并且将AndroidStudio更新到最新4.0.1版本,gradle版本如下:
对应的编译版本如下在最外层的buildGradle中:
3,编译之后可能还会报错,我用的10.0的oppo手机,发现报不支持armeabi库的问题,于是修改mmkv模块下的build.gradle文件,去掉了armeabi
4,编译通过后我们找模块mmkv然后编译出so库文件
点击上面的按钮就可以编译出不同版本的so库文件
5,取用自己的so库文件放置到自己项目中所对应的目录中
我只想要一个静态的so库,所以我只取用了这个so库
6,复制java文件到自己的项目中
将com.tencent.mmkv这个包整个copy到自己项目的java目录下面,如果之间复制到studio上,可能导致前面的com.tencent拷贝不进去,建议直接直接粘在在java这个目录里。如果想要跨进程,aidl下的也要copy到你的项目里。
注意:copy代码的时候一定要原封不动的将包名copy进去,不然可能出现so库找不到的现象。毕竟jni调用是根据包名寻找对应的方法的。
7,可能会有某些错误。
BuildConfig.DEBUG换乘至项目的,如果跟我一样,只是想用静态库,完全直接加载mmkv这个库就可以了,上面的if判断都可以去掉。
8,在application初始化的时候,如果你的版本是安卓4.4用的19版本的sdk要做如下判断:
如果你以前项目用的是原来的SharePreference则可以使用
importFromSharedPreferences将原来的存储方式导入到现在的存储方式
这样就可以使用mmtv的功能了,。当然迁移的过程中可能还有其他报错,但都很容易看出来,因为,mmkv整个项目其实都在c层,java层只是做了简单的封装。如果有兴趣,可以研究c层的代码,重点就是mmap映射函数。