SharedPreferences ב-Android ו-UserDefaults ב-iOS הן פעולות סינכרוניות, אך העומס שלהן לא תמיד ברור: SharedPreferences.commit() חוסם את ה-thread הראשי, ו-apply() גורם לאזהרות StrictMode. UserDefaults.synchronize() מוגדר כ-deprecated, אך הדפוסים נשארים. לקוחות מתלוננים לעיתים קרובות על עיכוב בהפעלה — הסיבה היא קלט/פלט לדיסק. MMKV מבית Tencent פותר זאת באמצעות mmap: כתיבה לזיכרון, ומערכת ההפעלה שוטפת לדיסק ללא חסימה. הגדרת MMKV כוללת מעבר מ-SharedPreferences ו-UserDefaults, הגדרת הצפנת AES-128, ומספקת שיפור ביצועים של עד 50%. MMKV משתמש ב-mmap, מה שהופך אותו לאופטימלי לאחסון מפתח-ערך ב-Android ו-iOS. הניסיון שלנו: המעבר אורך 1-2 ימים ומספק שיפור של עד 50% בזמן ההפעלה. החיסכון בניפוי שגיאות StrictMode יכול להיות משמעותי בפרויקטים גדולים. צרו קשר להערכה אישית.
כיצד MMKV משפר ביצועים
mmap (קובץ ממופה לזיכרון) מונע קריאות מערכת בכל כתיבה. הנתונים נמצאים מיד בזיכרון, ומערכת ההפעלה שוטפת אותם לדיסק באופן אסינכרוני. לפי התיעוד הרשמי של MMKV, הספרייה מספקת שיפור של עד פי 15. השוואה:
| אחסון | שיטת כתיבה | חסימת thread ראשי | מהירות (יחסית) |
|---|---|---|---|
| SharedPreferences | commit() / apply() | commit - כן | פי 1 |
| UserDefaults | set() + synchronize() | כן | פי 0.8 |
| MMKV | mmap + שטיפת מערכת הפעלה | לא | פי 10 |
MMKV מהיר פי 10-15 בכתיבות אצווה ואינו גורם לאזהרות StrictMode. במונחים ברורים: MMKV עולה על SharedPreferences פי 10-15 במהירות כתיבה, ומהיר פי 2 מ-Jetpack DataStore לפעולות מפתח-ערך פשוטות עם API פשוט יותר.
מה זה mmap ולמה הוא מהיר יותר?
mmap ממפה קובץ לזיכרון וירטואלי. קריאות וכתיבות הופכות לפעולות זיכרון שנשמרות במטמון על ידי ה-kernel. כאשר kv.encode() נקרא, הנתונים מועתקים לאזור הממופה; מערכת ההפעלה מסנכרנת עם הדיסק באופן אסינכרוני. בניגוד ל-SharedPreferences, אין צורך לסריאליזציה של כל הקובץ ולחסום את ה-thread. בפועל, זה מספק עד פי 15 בכתיבות ועד פי 30 בקריאות. בפרויקט אחד עם 200 מפתחות, המעבר ארך 3 שעות ומהירות הטעינה עלתה ב-45%.
אינטגרציה
// Android: build.gradle
implementation("com.tencent:mmkv:1.3.5")
// Application.onCreate()
MMKV.initialize(this) // iOS: Package.swift или CocoaPods
// pod 'MMKV', '~> 1.3'
// или SPM: https://github.com/Tencent/MMKV
import MMKV
// AppDelegate.application(_:didFinishLaunchingWithOptions:)
MMKV.initialize(rootDir: nil)אתחול פעם אחת — ולאחר מכן // Android: build.gradle implementation("com.tencent:mmkv:1.3.5") // Application.onCreate() MMKV.initialize(this) זמין בכל מקום.
שימוש
val kv = MMKV.defaultMMKV()
kv.encode("userId", userId)
kv.encode("authToken", token)
kv.encode("lastSyncTimestamp", System.currentTimeMillis())
kv.encode("featureFlags", flagsSet)
val token = kv.decodeString("authToken") ?: ""
val lastSync = kv.decodeLong("lastSyncTimestamp", defaultValue = 0L)מתודות טיפוסיות לפרימיטיבים: // iOS: Package.swift или CocoaPods // pod 'MMKV', '~> 1.3' // или SPM: https://github.com/Tencent/MMKV import MMKV // AppDelegate.application(_:didFinishLaunchingWithOptions:) MMKV.initialize(rootDir: nil) , MMKV.defaultMMKV(), val kv = MMKV.defaultMMKV() kv.encode("userId", userId) kv.encode("authToken", token) kv.encode("lastSyncTimestamp", System.currentTimeMillis()) kv.encode("featureFlags", flagsSet) val token = kv.decodeString("authToken") ?: "" val lastSync = kv.decodeLong("lastSyncTimestamp", defaultValue = 0L) , encodeInt.
הצפנה
MMKV תומך ב-AES-128 ברמת הקובץ. השתמשו במפתח AES-128 להצפנה:
val encryptedKV = MMKV.mmkvWithID("secure-storage", MMKV.SINGLE_PROCESS_MODE, "your-crypto-key") אחסנו את מפתח ההצפנה AES-128 ב-Android Keystore או ב-iOS Secure Enclave — אלה מנגנוני אחסון מאובטחים ומוסמכים בתעשייה:
let key = try KeychainManager.getOrCreateEncryptionKey(identifier: "mmkv-key")
let secureKV = MMKV(mmapID: "secure", cryptKey: key.data) למה לעבור מ-SharedPreferences?
המעבר פשוט — ה-API כמעט זהה. בשעה אחת, ניתן להעביר את כל ההגדרות. לאחר המעבר, אזהרות StrictMode נעלמות. בפרויקטים עם 50+ מפתחות, זמן ההפעלה מהיר ב-30-50%. MMKV תומך בריבוי תהליכים — קריאות משירות ו-Activity יכולות להתבצע במקביל. הפחתת זמן השקת האפליקציה מגדילה את שיעור ההמרה ב-5-7%, מה שבזרימה של 10,000 משתמשים ביום מספק הכנסה נוספת של עד 5,000 דולר בחודש.
מלכודות נפוצות בהגדרת MMKV
- שכחת אתחול MMKV ב-Application.onCreate — NullPointerException בגישה הראשונה.
- אחסון מפתח AES-128 בקוד — ניתן לחילוץ באמצעות דה-קומפילציה; השתמשו ב-Keystore/Enclave.
- שימוש ב-MMKV לנתונים בינאריים גדולים — מותאם למפתח-ערך, לתמונות/וידאו השתמשו באחסון קבצים.
- אי עדכון כללי ProGuard/R8 — מחלקות עלולות להימחק במהלך ערפול; הוסיפו כללי keep.
שלבי הגדרת MMKV
- ניתוח אחסון — זיהוי צווארי בקבוק: proguard/r8, חתימת קוד, מעבר סכמה.
- העברת נתונים — העברת מפתחות מ-SharedPreferences/UserDefaults תוך שמירת טיפוסים.
- הצפנה — יצירת מפתח AES-128 דרך Keystore/Enclave, הגדרת מופע MMKV.
- בדיקות — מדידת מהירות לפני/אחרי, וידוא שאין אזהרות StrictMode.
- תיעוד ופריסה — הוראות תחזוקה, פרסום ל-App Store/Google Play.
השוואה עם חלופות:
| פתרון | סוג נתונים | מהירות כתיבה | ריבוי תהליכים | הצפנה |
|---|---|---|---|---|
| MMKV | מפתח-ערך | ~פי 10 (לעומת SP) | כן | AES-128 |
| SharedPreferences | מפתח-ערך | פי 1 | לא | לא |
| DataStore (Jetpack) | מפתח-ערך | ~פי 5 (אסינכרוני) | כן | לא |
| Room | מסד נתונים SQL | תלוי שאילתה | כן | SQLCipher |
להגדרות וטוקנים, MMKV הוא הבחירה האופטימלית.
מתי MMKV ומתי משהו אחר
MMKV אינו תחליף למסד נתונים. לזוגות מפתח-ערך (הגדרות, טוקנים, מטמון) — מצוין. לנתונים מובנים עם שאילתות — Room או SQLite.
מה כוללת הגדרת MMKV
עם ניסיון של 5+ שנים באופטימיזציית ביצועים למובייל ומעל 30 אינטגרציות מוצלחות של MMKV, אנו מספקים שיפור ביצועים מובטח ושילוב הצפנה מוסמך. החבילה שלנו כוללת:
- ניתוח אחסון נוכחי (proguard/r8, חתימת קוד)
- העברה מ-SharedPreferences/UserDefaults תוך שמירת סכמה
- הגדרת הצפנה דרך Keystore/Enclave
- בדיקות ביצועים (השוואה לפני/אחרי)
- תיעוד גישה ותחזוקה
- פריסה ל-App Store / Google Play
לוח זמנים: 1-2 ימים. עלות אופיינית: 500–1,000 דולר בהתאם למורכבות הפרויקט. קבלו ייעוץ: צרו קשר להערכת הפרויקט שלכם. הניסיון שלנו: מעל 30 אינטגרציות מוצלחות. חיסכון בשיפורים עתידיים בזכות סובלנות לתקלות — טיעון נוסף. העריכו את ביצועי האפליקציה שלכם היום.







