From b56ce1004fdc67c913a2b6edc8a5fab597f47cb7 Mon Sep 17 00:00:00 2001 From: guoling Date: Wed, 11 Feb 2026 12:39:08 +0800 Subject: [PATCH] merge ashmem size with expectedCapacity on Android & OHOS --- .../MMKV/mmkv/src/main/cpp/native-bridge.cpp | 16 +++------- .../src/main/java/com/tencent/mmkv/MMKV.java | 13 ++++---- .../java/com/tencent/mmkv/MMKVConfig.java | 4 ++- .../main/java/com/tencent/mmkv/NameSpace.java | 2 +- .../mmkvdemo/BenchMarkBaseService.java | 2 +- Core/MMKV.cpp | 7 ++--- Core/MMKV.h | 31 +------------------ Core/MMKV_Android.cpp | 28 ++--------------- Core/MemoryFile.h | 2 +- Core/MemoryFile_Android.cpp | 5 +-- .../MMKV/src/main/cpp/native_bridge.cpp | 3 -- 11 files changed, 25 insertions(+), 88 deletions(-) diff --git a/Android/MMKV/mmkv/src/main/cpp/native-bridge.cpp b/Android/MMKV/mmkv/src/main/cpp/native-bridge.cpp index 9d628525..dedfba6e 100644 --- a/Android/MMKV/mmkv/src/main/cpp/native-bridge.cpp +++ b/Android/MMKV/mmkv/src/main/cpp/native-bridge.cpp @@ -304,8 +304,8 @@ static void onContentChangedByOuterProcess(const std::string &mmapID) { } MMKV_JNI jlong getMMKVWithID(JNIEnv *env, jobject, jstring mmapID, jint mode, jstring cryptKey, jstring rootPath, - jlong expectedCapacity, jboolean aes256, jint size, jint enableKeyExpire, - jint expiredInSeconds, jboolean enableCompareBeforeSet, jint recover, jint itemSizeLimit) { + jlong expectedCapacity, jboolean aes256, jint enableKeyExpire, jint expiredInSeconds, + jboolean enableCompareBeforeSet, jint recover, jint itemSizeLimit) { MMKV *kv = nullptr; if (!mmapID) { return (jlong) kv; @@ -316,9 +316,6 @@ MMKV_JNI jlong getMMKVWithID(JNIEnv *env, jobject, jstring mmapID, jint mode, js config.mode = (MMKVMode) mode; config.aes256 = aes256; config.expectedCapacity = expectedCapacity; - if (size != 0) { - config.size = size; - } if (enableKeyExpire >= 0) { config.enableKeyExpire = (enableKeyExpire != 0); } @@ -358,7 +355,7 @@ MMKV_JNI jlong getMMKVWithID(JNIEnv *env, jobject, jstring mmapID, jint mode, js } MMKV_JNI jlong getDefaultMMKV(JNIEnv *env, jobject obj, jint mode, jstring cryptKey, jlong expectedCapacity, - jboolean aes256, jint size, jint enableKeyExpire, jint expiredInSeconds, + jboolean aes256, jint enableKeyExpire, jint expiredInSeconds, jboolean enableCompareBeforeSet, jint recover, jint itemSizeLimit) { MMKV *kv = nullptr; @@ -366,9 +363,6 @@ MMKV_JNI jlong getDefaultMMKV(JNIEnv *env, jobject obj, jint mode, jstring crypt config.mode = (MMKVMode) mode; config.aes256 = aes256; config.expectedCapacity = expectedCapacity; - if (size != 0) { - config.size = size; - } if (enableKeyExpire >= 0) { config.enableKeyExpire = (enableKeyExpire != 0); } @@ -1196,8 +1190,8 @@ static JNINativeMethod g_methods[] = { {"ashmemFD", "()I", (void *) mmkv::ashmemFD}, {"ashmemMetaFD", "()I", (void *) mmkv::ashmemMetaFD}, {"jniInitialize", "(Ljava/lang/String;Ljava/lang/String;IZZJ)V", (void *) mmkv::jniInitialize}, - {"getMMKVWithID", "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;JZIIIZII)J", (void *) mmkv::getMMKVWithID}, - {"getDefaultMMKV", "(ILjava/lang/String;JZIIIZII)J", (void *) mmkv::getDefaultMMKV}, + {"getMMKVWithID", "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;JZIIZII)J", (void *) mmkv::getMMKVWithID}, + {"getDefaultMMKV", "(ILjava/lang/String;JZIIZII)J", (void *) mmkv::getDefaultMMKV}, {"getMMKVWithAshmemFD", "(Ljava/lang/String;IILjava/lang/String;Z)J", (void *) mmkv::getMMKVWithAshmemFD}, {"encodeBool", "(JLjava/lang/String;Z)Z", (void *) mmkv::encodeBool}, {"encodeBool_2", "(JLjava/lang/String;ZI)Z", (void *) mmkv::encodeBool_2}, diff --git a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKV.java b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKV.java index 1fc4cdd3..03e1906d 100644 --- a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKV.java +++ b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKV.java @@ -410,7 +410,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { int recover = (value == null) ? -1 : value; long handle = getMMKVWithID(mmapID, config.mode, config.cryptKey, config.rootPath, config.expectedCapacity, - config.aes256, config.size, enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, + config.aes256, enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, recover, config.itemSizeLimit); return checkProcessMode(handle, mmapID, config.mode); @@ -668,7 +668,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { boolean aes256) throws RuntimeException { MMKVConfig config = new MMKVConfig(); config.mode = mode | ASHMEM_MODE; - config.size = size; + config.expectedCapacity = size; config.aes256 = aes256; config.cryptKey = cryptKey; return mmkvWithAshmemID(context, mmapID, config); @@ -704,7 +704,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { simpleLog(MMKVLogLevel.LevelInfo, "getting parcelable mmkv in process, Uri = " + uri); Bundle extras = new Bundle(); - extras.putInt(MMKVContentProvider.KEY_SIZE, config.size); + extras.putInt(MMKVContentProvider.KEY_SIZE, (int) config.expectedCapacity); extras.putInt(MMKVContentProvider.KEY_MODE, config.mode); if (config.cryptKey != null) { extras.putString(MMKVContentProvider.KEY_CRYPT, config.cryptKey); @@ -790,8 +790,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { int recover = (value == null) ? -1 : value; long handle = getDefaultMMKV(config.mode, config.cryptKey, config.expectedCapacity, config.aes256, - config.size, enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, - recover, config.itemSizeLimit); + enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, recover, config.itemSizeLimit); return checkProcessMode(handle, "DefaultMMKV", config.mode); } @@ -1961,11 +1960,11 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { native static long getMMKVWithID(String mmapID, int mode, @Nullable String cryptKey, @Nullable String rootPath, - long expectedCapacity, boolean aes256, int size, int enableKeyExpire, int expiredInSeconds, + long expectedCapacity, boolean aes256, int enableKeyExpire, int expiredInSeconds, boolean enableCompareBeforeSet, int recover, int itemSizeLimit); private native static long getDefaultMMKV(int mode, @Nullable String cryptKey, long expectedCapacity, - boolean aes256, int size, int enableKeyExpire, int expiredInSeconds, + boolean aes256, int enableKeyExpire, int expiredInSeconds, boolean enableCompareBeforeSet, int recover, int itemSizeLimit); private native static long getMMKVWithAshmemFD(String mmapID, int fd, int metaFD, @Nullable String cryptKey, boolean aes256); diff --git a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKVConfig.java b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKVConfig.java index ea288ef6..1e304cc0 100644 --- a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKVConfig.java +++ b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/MMKVConfig.java @@ -20,6 +20,9 @@ package com.tencent.mmkv; +/** + * The all-in-one configuration for creating an MMKV instance. + */ public class MMKVConfig { public int mode = MMKV.SINGLE_PROCESS_MODE; @@ -29,7 +32,6 @@ public class MMKVConfig { public String cryptKey = null; public String rootPath = null; - public int size = MMKV.pageSize(); // for ashmem size public long expectedCapacity = 0; // the initial file size diff --git a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/NameSpace.java b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/NameSpace.java index b46dcf1a..665d8131 100644 --- a/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/NameSpace.java +++ b/Android/MMKV/mmkv/src/main/java/com/tencent/mmkv/NameSpace.java @@ -66,7 +66,7 @@ public final class NameSpace { int recover = (config.recover == null) ? -1 : ((config.recover == MMKVRecoverStrategic.OnErrorDiscard) ? 0 : 1); long handle = MMKV.getMMKVWithID(mmapID, config.mode, config.cryptKey, rootDir, config.expectedCapacity, - config.aes256, config.size, enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, + config.aes256, enableKeyExpire, config.expiredInSeconds, config.enableCompareBeforeSet, recover, config.itemSizeLimit); return MMKV.checkProcessMode(handle, mmapID, config.mode); diff --git a/Android/MMKV/mmkvdemo/src/main/java/com/tencent/mmkvdemo/BenchMarkBaseService.java b/Android/MMKV/mmkvdemo/src/main/java/com/tencent/mmkvdemo/BenchMarkBaseService.java index 7d57508a..8ce4500c 100644 --- a/Android/MMKV/mmkvdemo/src/main/java/com/tencent/mmkvdemo/BenchMarkBaseService.java +++ b/Android/MMKV/mmkvdemo/src/main/java/com/tencent/mmkvdemo/BenchMarkBaseService.java @@ -333,7 +333,7 @@ public abstract class BenchMarkBaseService extends Service { final String id = "tetAshmemMMKV"; try { MMKVConfig config = new MMKVConfig(); - config.size = AshmemMMKV_Size; + config.expectedCapacity = AshmemMMKV_Size; config.mode = MMKV.MULTI_PROCESS_MODE; config.cryptKey = CryptKey; m_ashmemMMKV = MMKV.mmkvWithAshmemID(BenchMarkBaseService.this, id, config); diff --git a/Core/MMKV.cpp b/Core/MMKV.cpp index e6462fb7..11567f92 100755 --- a/Core/MMKV.cpp +++ b/Core/MMKV.cpp @@ -268,6 +268,7 @@ MMKV *MMKV::getMMKVWithID(const std::string &mmapID, const MMKVConfig &config) { (*g_instanceDic)[mmapKey] = kv; return kv; } +#endif MMKV *MMKV::mmkvWithID(const string &mmapID, MMKVMode mode, const string *cryptKey, const MMKVPath_t *rootPath, size_t expectedCapacity, bool aes256) { MMKVConfig config; @@ -282,8 +283,6 @@ MMKV *MMKV::mmkvWithID(const string &mmapID, MMKVMode mode, const string *cryptK return mmkvWithID(mmapID, config); } -#endif - MMKV *MMKV::mmkvWithID(const std::string &mmapID, const MMKVConfig &config) { if (mmapID.empty() || !g_instanceLock) { return nullptr; @@ -1502,7 +1501,7 @@ bool MMKV::restoreOneFromDirectory(const string &mmapKey, const MMKVPath_t &srcP #ifndef MMKV_ANDROID MemoryFile srcCRCFile(srcCRCPath); #else - MemoryFile srcCRCFile(srcCRCPath, DEFAULT_MMAP_SIZE, MMFILE_TYPE_FILE); + MemoryFile srcCRCFile(srcCRCPath, MMFILE_TYPE_FILE); #endif if (srcCRCFile.isFileValid()) { memcpy(kv->m_metaFile->getMemory(), srcCRCFile.getMemory(), sizeof(MMKVMetaInfo)); @@ -1806,7 +1805,6 @@ NameSpace MMKV::defaultNameSpace() { return NameSpace(g_realRootDir); } -#ifndef MMKV_ANDROID MMKV *NameSpace::mmkvWithID(const string &mmapID, MMKVMode mode, const string *cryptKey, size_t expectedCapacity, bool aes256) { MMKVConfig config; config.mode = mode; @@ -1818,7 +1816,6 @@ MMKV *NameSpace::mmkvWithID(const string &mmapID, MMKVMode mode, const string *c config.expectedCapacity = expectedCapacity; return MMKV::getMMKVWithID(mmapID, config); } -#endif MMKV *NameSpace::mmkvWithID(const string &mmapID, const MMKVConfig &config) { if (!config.rootPath || *config.rootPath != m_rootDir) { diff --git a/Core/MMKV.h b/Core/MMKV.h index 1396c763..5a9201f2 100755 --- a/Core/MMKV.h +++ b/Core/MMKV.h @@ -78,9 +78,6 @@ struct MMKVConfig { const MMKVPath_t *rootPath = nullptr; -#ifdef MMKV_ANDROID - int size = static_cast(mmkv::DEFAULT_MMAP_SIZE); // for ashmem size -#endif size_t expectedCapacity = 0; // the initial file size std::optional enableKeyExpire = std::nullopt; @@ -311,7 +308,6 @@ public: // if you want a per-user mmkv, you could merge user-id within mmapID static MMKV *mmkvWithID(const std::string &mmapID, const MMKVConfig &config); -#ifndef MMKV_ANDROID // mmapID: any unique ID (com.tencent.xin.pay, etc.) // if you want a per-user mmkv, you could merge user-id within mmapID // cryptKey: 16 bytes at most @@ -322,18 +318,7 @@ public: size_t expectedCapacity = 0, bool aes256 = false); -#else // defined(MMKV_ANDROID) - // mmapID: any unique ID (com.tencent.xin.pay, etc.) - // if you want a per-user mmkv, you could merge user-id within mmapID - // cryptKey: 16 bytes at most - static MMKV *mmkvWithID(const std::string &mmapID, - int size = mmkv::DEFAULT_MMAP_SIZE, - MMKVMode mode = MMKV_SINGLE_PROCESS, - const std::string *cryptKey = nullptr, - const MMKVPath_t *rootPath = nullptr, - size_t expectedCapacity = 0, - bool aes256 = false); - +#ifdef MMKV_ANDROID static MMKV *mmkvWithAshmemFD(const std::string &mmapID, int fd, int metaFD, const MMKVConfig &config); static MMKV *mmkvWithAshmemFD(const std::string &mmapID, int fd, int metaFD, const std::string *cryptKey = nullptr, @@ -772,7 +757,6 @@ public: MMKV *mmkvWithID(const std::string &mmapID, const MMKVConfig &config); -#ifndef MMKV_ANDROID // mmapID: any unique ID (com.tencent.xin.pay, etc.) // if you want a per-user mmkv, you could merge user-id within mmapID // cryptKey: 16 bytes at most @@ -782,19 +766,6 @@ public: size_t expectedCapacity = 0, bool aes256 = false); -#else // defined(MMKV_ANDROID) - - // mmapID: any unique ID (com.tencent.xin.pay, etc.) - // if you want a per-user mmkv, you could merge user-id within mmapID - // cryptKey: 16 bytes at most - MMKV *mmkvWithID(const std::string &mmapID, - int size = mmkv::DEFAULT_MMAP_SIZE, - MMKVMode mode = MMKV_SINGLE_PROCESS, - const std::string *cryptKey = nullptr, - size_t expectedCapacity = 0, - bool aes256 = false); -#endif // MMKV_ANDROID - // backup one MMKV instance to dstDir bool backupOneToDirectory(const std::string &mmapID, const MMKVPath_t &dstDir); diff --git a/Core/MMKV_Android.cpp b/Core/MMKV_Android.cpp index 713719dd..aba40b35 100644 --- a/Core/MMKV_Android.cpp +++ b/Core/MMKV_Android.cpp @@ -52,8 +52,8 @@ MMKV::MMKV(const string &mmapID, const MMKVConfig &config) , m_dic(nullptr) , m_dicCrypt(nullptr) , m_expectedCapacity(std::max(DEFAULT_MMAP_SIZE, roundUp(config.expectedCapacity, DEFAULT_MMAP_SIZE))) - , m_file(new MemoryFile(m_path, config.size, isAshmem() ? MMFILE_TYPE_ASHMEM : MMFILE_TYPE_FILE, m_expectedCapacity, isReadOnly(), !isAshmem())) - , m_metaFile(new MemoryFile(m_crcPath, DEFAULT_MMAP_SIZE, m_file->m_fileType, 0, isReadOnly())) + , m_file(new MemoryFile(m_path, isAshmem() ? MMFILE_TYPE_ASHMEM : MMFILE_TYPE_FILE, m_expectedCapacity, isReadOnly(), !isAshmem())) + , m_metaFile(new MemoryFile(m_crcPath, m_file->m_fileType, DEFAULT_MMAP_SIZE, isReadOnly())) , m_metaInfo(new MMKVMetaInfo()) , m_crypter(nullptr) , m_lock(new ThreadLock()) @@ -265,17 +265,6 @@ MMKV *MMKV::getMMKVWithID(const string &mmapID, const MMKVConfig &config) { return kv; } -MMKV *MMKV::mmkvWithID(const string &mmapID, int size, MMKVMode mode, const string *cryptKey, const string *rootPath, size_t expectedCapacity, bool aes256) { - MMKVConfig config; - config.mode = mode; - config.rootPath = rootPath; - config.aes256 = aes256; - config.cryptKey = cryptKey; - config.size = size; - config.expectedCapacity = expectedCapacity; - return getMMKVWithID(mmapID, config); -} - MMKV *MMKV::mmkvWithAshmemFD(const std::string &mmapID, int fd, int metaFD, const std::string *cryptKey, bool aes256) { MMKVConfig config; config.aes256 = aes256; @@ -392,17 +381,4 @@ void MMKV::enableDisableProcessMode(bool enable) { #endif // !MMKV_OHOS -MMKV *NameSpace::mmkvWithID(const string &mmapID, int size, MMKVMode mode, const string *cryptKey, size_t expectedCapacity, bool aes256) { - MMKVConfig config; - config.mode = mode; -#ifndef MMKV_DISABLE_CRYPT - config.aes256 = aes256; - config.cryptKey = cryptKey; -#endif - config.size = size; - config.rootPath = &m_rootDir; - config.expectedCapacity = expectedCapacity; - return MMKV::getMMKVWithID(mmapID, config); -} - #endif // MMKV_ANDROID diff --git a/Core/MemoryFile.h b/Core/MemoryFile.h index e718bd81..42c22d54 100755 --- a/Core/MemoryFile.h +++ b/Core/MemoryFile.h @@ -140,7 +140,7 @@ public: #ifndef MMKV_ANDROID explicit MemoryFile(MMKVPath_t path, size_t expectedCapacity = 0, bool readOnly = false, bool mayflyFD = false); #else - MemoryFile(MMKVPath_t path, size_t size, FileType fileType, size_t expectedCapacity = 0, bool readOnly = false, bool mayflyFD = false); + MemoryFile(MMKVPath_t path, FileType fileType, size_t expectedCapacity = 0, bool readOnly = false, bool mayflyFD = false); explicit MemoryFile(MMKVFileHandle_t ashmemFD); const FileType m_fileType; diff --git a/Core/MemoryFile_Android.cpp b/Core/MemoryFile_Android.cpp index 5e054454..d55af372 100644 --- a/Core/MemoryFile_Android.cpp +++ b/Core/MemoryFile_Android.cpp @@ -70,8 +70,9 @@ File::File(MMKVFileHandle_t ashmemFD) } } -MemoryFile::MemoryFile(string path, size_t size, FileType fileType, size_t expectedCapacity, bool isReadOnly, bool mayflyFD) - : m_diskFile(std::move(path), isReadOnly ? OpenFlag::ReadOnly : (OpenFlag::ReadWrite | OpenFlag::Create), size, fileType), +MemoryFile::MemoryFile(string path, FileType fileType, size_t expectedCapacity, bool isReadOnly, bool mayflyFD) + : m_diskFile(std::move(path), isReadOnly ? OpenFlag::ReadOnly : (OpenFlag::ReadWrite | OpenFlag::Create), + expectedCapacity, fileType), m_ptr(nullptr), m_size(0), m_fileType(fileType), m_readOnly(isReadOnly), m_isMayflyFD(mayflyFD) { if (m_fileType == MMFILE_TYPE_FILE) { reloadFromFile(expectedCapacity); diff --git a/OpenHarmony/MMKV/src/main/cpp/native_bridge.cpp b/OpenHarmony/MMKV/src/main/cpp/native_bridge.cpp index dfc4f3d7..c2cfaac2 100644 --- a/OpenHarmony/MMKV/src/main/cpp/native_bridge.cpp +++ b/OpenHarmony/MMKV/src/main/cpp/native_bridge.cpp @@ -602,9 +602,6 @@ static napi_value mmkvWithID(napi_env env, napi_callback_info info) { config.aes256 = aes256; config.cryptKey = cryptKey.empty() ? nullptr : &cryptKey; config.expectedCapacity = expectedCapacity; - if (expectedCapacity != 0) { - config.size = expectedCapacity; - } if (enableKeyExpire >= 0) { config.enableKeyExpire = (enableKeyExpire != 0); }