前言
MMKV是騰訊開發(fā)的開源存儲庫,用內(nèi)存轉(zhuǎn)儲的形式存儲鍵值對數(shù)據(jù)雾鬼,支持Android / macOS / Windows / POSIX / HarmonyOS NEXT 等平臺。特點是速度非成驯瘢快洞渤,哪怕應用閃退了都能保證數(shù)據(jù)能夠被保存下來。
但新版本的MMKV不支持armv7這樣的老架構(gòu)西轩,一些上古設(shè)備只支持32位就用不上MMKV的新版本。
本文內(nèi)容是自行編譯32位庫并添加到APP中的流程脑沿。
編譯so庫
先把源碼拉下來藕畔,目前最新版本是2.0.0
git clone https://github.com/Tencent/MMKV/blob/master
然后用Android Studio 4.2以上的版本打開/Android/MMKV
這個路徑,打開以后里面有三層:
mmkv
庫本體
mmkvannotation
注解捅伤,不用管
mmkvdemo
Demo源碼
打開mmkv
的build.gradle
劫流,找到這段
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
// uncomment this line to support 32-bit ABIs (armeabi-v7a & x86)
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
abiFilters 'arm64-v8a', 'x86_64'
}
}
ndkVersion = '26.3.11579264'
minSdkVersion rootProject.ext.minSdkVersion
}
把它改成這樣
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
abiFilters 'armeabi-v7a'
}
}
ndkVersion = '26.3.11579264'
minSdkVersion rootProject.ext.minSdkVersion
}
然后打開Android Studio的設(shè)置,搜SDK丛忆,檢查一下有沒有安裝26.3.11579264
這個版本的NDK祠汇,沒有的話就裝一下。
編譯目標選mmkvdemo
熄诡,點菜單 Build -> Build Bundle(s)/APK(s) -> Build APK(s)
或者直接點綠三角運行一下可很。
然后找這個目錄mmkv\build\intermediates\library_jni\DefaultCppDebug\jni
,里面有個libmmkv.so
就是我們要的凰浮。
下載官方的aar
隨便找一個APP項目我抠,在gradle里面導入和剛剛修改的源碼相同版本的mmkv
implementation 'com.tencent:mmkv-static:2.0.0'
然后在build.gradle底部加上這段,這兩個函數(shù)可以把gradle同步下來的包復制一份到指定的目錄里袜茧。
task listDependencies {
doLast {
configurations.each { config ->
if (config.canBeResolved) {
config.files.each { file ->
println file
}
}
}
}
}
task copyDependencies(type: Copy) {
from {
configurations.findAll { config ->
config.canBeResolved
}.collect { config ->
config.files
}
}
into "$buildDir/libs/dependencies"
}
點右上角Sync
同步一下菜拓,此時會發(fā)現(xiàn)這兩個task前面多了個綠三角。先點第一個的綠三角笛厦,選第一項run纳鼎,等控制臺輸出結(jié)束,再點第二個的綠三角。
然后去app\build\libs\dependencies
這個目錄就能找到aar
包了贱鄙。
向aar中添加so庫
用壓縮軟件打開官方的aar包劝贸,結(jié)構(gòu)大概長這樣
Archive: mmkv-static-2.0.0.aar
Length Date Time Name
--------- ---------- ----- ----
0 1980-02-01 00:00 aidl/
0 1980-02-01 00:00 aidl/com/
0 1980-02-01 00:00 aidl/com/tencent/
0 1980-02-01 00:00 aidl/com/tencent/mmkv/
67 1980-02-01 00:00 aidl/com/tencent/mmkv/ParcelableMMKV.aidl
244 1980-02-01 00:00 AndroidManifest.xml
0 1980-02-01 00:00 arm64-v8a/
26165 1980-02-01 00:00 classes.jar
0 1980-02-01 00:00 com/
0 1980-02-01 00:00 com/tencent/
0 1980-02-01 00:00 com/tencent/mmkv/
0 1980-02-01 00:00 jni/
0 1980-02-01 00:00 jni/arm64-v8a/
584368 1980-02-01 00:00 jni/arm64-v8a/libmmkv.so
0 1980-02-01 00:00 jni/x86_64/
576112 1980-02-01 00:00 jni/x86_64/libmmkv.so
44 1980-02-01 00:00 META-INF/com/android/build/gradle/aar-metadata.properties
401 1980-02-01 00:00 proguard.txt
0 1980-02-01 00:00 R.txt
0 1980-02-01 00:00 x86_64/
--------- -------
在最外層新建一個空的armeabi-v7a
目錄
然后在jni
這個目錄下再新建一個armeabi-v7a
目錄,把上一步我們自己編譯的libmmkv.so
放進去逗宁,重新壓縮即可
Archive: mmkv-static-2.0.0-armv7.aar
Length Date Time Name
--------- ---------- ----- ----
0 1980-02-01 00:00 aidl/
0 1980-02-01 00:00 aidl/com/
0 1980-02-01 00:00 aidl/com/tencent/
0 1980-02-01 00:00 aidl/com/tencent/mmkv/
67 1980-02-01 00:00 aidl/com/tencent/mmkv/ParcelableMMKV.aidl
244 1980-02-01 00:00 AndroidManifest.xml
0 1980-02-01 00:00 arm64-v8a/
0 2024-11-07 14:23 armeabi-v7a/ <-新建的空目錄
26165 1980-02-01 00:00 classes.jar
0 1980-02-01 00:00 com/
0 1980-02-01 00:00 com/tencent/
0 1980-02-01 00:00 com/tencent/mmkv/
0 1980-02-01 00:00 jni/
0 1980-02-01 00:00 jni/arm64-v8a/
584368 1980-02-01 00:00 jni/arm64-v8a/libmmkv.so
0 2024-11-07 14:23 jni/armeabi-v7a/ <-新建的目錄
670260 2024-11-07 14:09 jni/armeabi-v7a/libmmkv.so <-自己編譯的so庫
0 1980-02-01 00:00 jni/x86_64/
576112 1980-02-01 00:00 jni/x86_64/libmmkv.so
44 1980-02-01 00:00 META-INF/com/android/build/gradle/aar-metadata.properties
401 1980-02-01 00:00 proguard.txt
0 1980-02-01 00:00 R.txt
0 1980-02-01 00:00 x86_64/
--------- -------
1857661 23 files
重新導包
回到要使用MMKV的安卓項目映九,打開build.gradle
,刪掉這行
implementation 'com.tencent:mmkv-static:2.0.0'
然后新增一行
implementation fileTree(dir: 'libs', include: ['*.aar'])
把我們剛剛重新打包好的mmkv-static-2.0.0-armv7.aar
放到app/libs
目錄下
重新Sync
一下
搞定了瞎颗,現(xiàn)在MMKV 2.0.0支持32位的armv7了
參考資料
MMKV——基于 mmap 的高性能通用 key-value 組件
android_setup_cn MMKV for Android