एंड्रॉइड 10 उपयोगकर्ता डेटा चेकपॉइंट (यूडीसी) पेश करता है, जो एंड्रॉइड ओवर-द-एयर (ओटीए) अपडेट विफल होने पर एंड्रॉइड को अपनी पिछली स्थिति में वापस लाने की अनुमति देता है। यूडीसी के साथ, यदि एंड्रॉइड ओटीए अपडेट विफल हो जाता है, तो डिवाइस सुरक्षित रूप से अपनी पिछली स्थिति में वापस आ सकता है। हालाँकि ए/बी अपडेट प्रारंभिक बूट के लिए इस समस्या का समाधान करते हैं, लेकिन उपयोगकर्ता डेटा विभाजन ( /data
पर आरूढ़) को संशोधित करने पर रोलबैक समर्थित नहीं है।
यूडीसी संशोधित होने के बाद भी डिवाइस को उपयोगकर्ता डेटा विभाजन को वापस लाने में सक्षम बनाता है। यूडीसी सुविधा फ़ाइल सिस्टम में चेकपॉइंट क्षमताओं के साथ इसे पूरा करती है, एक वैकल्पिक कार्यान्वयन जब फ़ाइल सिस्टम चेकपॉइंट्स का समर्थन नहीं करता है, बूटलोडर ए/बी तंत्र के साथ एकीकरण जबकि गैर-ए/बी अपडेट का भी समर्थन करता है, और कुंजी संस्करण बाइंडिंग के लिए समर्थन करता है। और कुंजी रोलबैक रोकथाम।
उपयोगकर्ता प्रभाव
यूडीसी सुविधा उपयोगकर्ताओं के लिए ओटीए अपडेट अनुभव को बेहतर बनाती है क्योंकि ओटीए अपडेट विफल होने पर कम उपयोगकर्ता अपना डेटा खो देते हैं। इससे उन उपयोगकर्ताओं की समर्थन कॉल की संख्या कम हो सकती है जिन्हें अद्यतन प्रक्रिया के दौरान समस्याओं का सामना करना पड़ता है। हालाँकि, जब कोई OTA अपडेट विफल हो जाता है, तो उपयोगकर्ता डिवाइस को कई बार रीबूट होते हुए देख सकते हैं।
यह काम किस प्रकार करता है
विभिन्न फ़ाइल सिस्टमों में चेकपॉइंट कार्यक्षमता
F2FS फ़ाइल सिस्टम के लिए, UDC अपस्ट्रीम 4.20 लिनक्स कर्नेल में चेकपॉइंट कार्यक्षमता जोड़ता है और इसे एंड्रॉइड 10 चलाने वाले उपकरणों द्वारा समर्थित सभी सामान्य कर्नेल पर बैकपोर्ट करता है।
अन्य फ़ाइल सिस्टम के लिए, यूडीसी चेकपॉइंट कार्यक्षमता के लिए dm_bow
नामक डिवाइस मैपर वर्चुअल डिवाइस का उपयोग करता है। dm_bow
डिवाइस और फ़ाइल सिस्टम के बीच बैठता है। जब एक पार्टीशन माउंट किया जाता है, तो एक ट्रिम जारी किया जाता है, जिससे फ़ाइल सिस्टम सभी फ्री ब्लॉक पर ट्रिम कमांड जारी करता है। dm_bow
इन ट्रिम्स को इंटरसेप्ट करता है और एक निःशुल्क ब्लॉक सूची सेट करने के लिए उनका उपयोग करता है। पढ़ने और लिखने को फिर असंशोधित डिवाइस पर भेजा जाता है, लेकिन लिखने की अनुमति देने से पहले, पुनर्स्थापना के लिए आवश्यक डेटा को एक मुफ्त ब्लॉक में बैकअप किया जाता है।
चेकप्वाइंट प्रक्रिया
जब checkpoint=fs/block
फ़्लैग वाला एक विभाजन माउंट किया जाता है, तो डिवाइस को किसी भी मौजूदा चेकपॉइंट को पुनर्स्थापित करने की अनुमति देने के लिए एंड्रॉइड ड्राइव पर restoreCheckpoint
कॉल करता है। init
फिर यह निर्धारित करने के लिए needsCheckpoint
फ़ंक्शन को कॉल करता है कि क्या डिवाइस या तो बूटलोडर A/B स्थिति में है या उसने अपडेट रिट्री काउंट सेट किया है। यदि इनमें से कोई भी सत्य है, तो एंड्रॉइड माउंट फ़्लैग जोड़ने या dm_bow
डिवाइस बनाने के लिए createCheckpoint
कॉल करता है।
विभाजन माउंट होने के बाद, ट्रिम्स जारी करने के लिए चेकपॉइंट कोड को कॉल किया जाता है। फिर बूट प्रक्रिया सामान्य रूप से जारी रहती है। LOCKED_BOOT_COMPLETE
पर, एंड्रॉइड वर्तमान चेकपॉइंट को प्रतिबद्ध करने के लिए commitCheckpoint
कॉल करता है और अपडेट सामान्य रूप से जारी रहता है।
कीमास्टर कुंजियाँ प्रबंधित करें
कीमास्टर कुंजियों का उपयोग डिवाइस एन्क्रिप्शन या अन्य उद्देश्यों के लिए किया जाता है। इन कुंजियों को प्रबंधित करने के लिए, एंड्रॉइड कुंजी डिलीट कॉल को चेकपॉइंट प्रतिबद्ध होने तक विलंबित करता है।
स्वास्थ्य की निगरानी करें
एक स्वास्थ्य डेमॉन सत्यापित करता है कि चेकपॉइंट बनाने के लिए पर्याप्त डिस्क स्थान है। स्वास्थ्य डेमॉन Checkpoint.cpp
में cp_healthDaemon
में स्थित है।
स्वास्थ्य डेमॉन में निम्नलिखित व्यवहार हैं जिन्हें कॉन्फ़िगर किया जा सकता है:
-
ro.sys.cp_msleeptime
: यह नियंत्रित करता है कि डिवाइस कितनी बार डिस्क उपयोग की जाँच करता है। -
ro.sys.cp_min_free_bytes
: स्वास्थ्य डेमॉन द्वारा अपेक्षित न्यूनतम मान को नियंत्रित करता है। -
ro.sys.cp_commit_on_full
: नियंत्रित करता है कि स्वास्थ्य डेमॉन डिवाइस को रीबूट करता है या चेकपॉइंट करता है और डिस्क भर जाने पर भी जारी रहता है।
चेकप्वाइंट एपीआई
चेकपॉइंट एपीआई का उपयोग यूडीसी सुविधा द्वारा किया जाता है। यूडीसी द्वारा उपयोग किए जाने वाले अन्य एपीआई के लिए, IVold.aidl
देखें।
शून्य प्रारंभ जांच बिंदु(पुनः प्रयास करें)
एक चौकी बनाता है.
जब फ्रेमवर्क अपडेट शुरू करने के लिए तैयार होता है तो वह इस विधि को कॉल करता है। चेकपॉइंट को चेकपॉइंट फ़ाइल सिस्टम जैसे उपयोगकर्ता डेटा को रिबूट के बाद आर/डब्ल्यू माउंट करने से पहले बनाया जाता है। यदि पुनर्प्रयास संख्या सकारात्मक है, तो एपीआई पुनर्प्रयासों की ट्रैकिंग को संभालता है, और अद्यतनकर्ता यह जांचने के लिए needsRollback
कॉल करता है कि क्या अद्यतन के रोलबैक की आवश्यकता है। यदि पुनः प्रयास की संख्या -1
है, तो एपीआई ए/बी बूटलोडर के निर्णय को स्थगित कर देता है।
सामान्य ए/बी अपडेट करते समय इस विधि को नहीं बुलाया जाता है।
शून्य प्रतिबद्धता परिवर्तन()
परिवर्तन प्रतिबद्ध करता है.
जब परिवर्तन प्रतिबद्ध होने के लिए तैयार होते हैं तो फ्रेमवर्क रीबूट के बाद इस विधि को कॉल करता है। इसे डेटा (जैसे चित्र, वीडियो, एसएमएस, प्राप्ति की सर्वर रसीद) से पहले उपयोगकर्ता डेटा पर और BootComplete
से पहले लिखा जाता है।
यदि कोई सक्रिय चेकपॉइंट अद्यतन मौजूद नहीं है, तो इस विधि का कोई प्रभाव नहीं पड़ता है।
गर्भपातपरिवर्तन()
फोर्स रिबूट होता है और चेकपॉइंट पर वापस आ जाता है। पहले रिबूट के बाद से सभी उपयोगकर्ता डेटा संशोधनों को छोड़ देता है।
फ्रेमवर्क इस विधि को रिबूट के बाद लेकिन commitChanges
पहले कॉल करता है। जब इस विधि को कॉल किया जाता है तो retry_counter
कम हो जाता है। लॉग प्रविष्टियाँ उत्पन्न होती हैं।
बूल को रोलबैक() की आवश्यकता है
निर्धारित करता है कि रोलबैक की आवश्यकता है या नहीं।
नॉनचेकपॉइंट डिवाइस पर, false
रिटर्न देता है। चेकपॉइंट डिवाइस पर, नॉनचेकपॉइंट बूट के दौरान true
लौटाता है।
यूडीसी लागू करें
संदर्भ कार्यान्वयन
यूडीसी को कैसे लागू किया जा सकता है इसके उदाहरण के लिए, dm-bow.c देखें। सुविधा पर अतिरिक्त दस्तावेज़ीकरण के लिए, dm-bow.txt देखें।
स्थापित करना
अपनी init.hardware.rc
फ़ाइल में on fs
में, सुनिश्चित करें कि आपके पास:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
अपनी init.hardware.rc
फ़ाइल में on late-fs
, सुनिश्चित करें कि आपके पास:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
आपकी fstab.hardware
फ़ाइल में, सुनिश्चित करें कि /data
latemount
के रूप में टैग किया गया है।
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs
मेटाडेटा विभाजन जोड़ें
यूडीसी को नॉनबूटलोडर रिट्री गिनती और कुंजियों को संग्रहीत करने के लिए मेटाडेटा विभाजन की आवश्यकता होती है। एक मेटाडेटा विभाजन सेट करें और इसे /metadata
पर जल्दी माउंट करें।
आपकी fstab.hardware
फ़ाइल में, सुनिश्चित करें कि /metadata
earlymount
या first_stage_mount
के रूप में टैग किया गया है।
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
सभी शून्यों के लिए विभाजन प्रारंभ करें।
निम्नलिखित पंक्तियों को BoardConfig.mk
में जोड़ें:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
सिस्टम अपडेट करें
F2FS सिस्टम
उन प्रणालियों के लिए जो डेटा को प्रारूपित करने के लिए F2FS का उपयोग करते हैं, सुनिश्चित करें कि F2FS का आपका संस्करण चेकपॉइंट्स का समर्थन करता है। अधिक जानकारी के लिए, विभिन्न फ़ाइल सिस्टम में चेकपॉइंट कार्यक्षमता देखें।
/data
पर माउंट किए गए डिवाइस के लिए fstab के <fs_mgr_flags>
अनुभाग में checkpoint=fs
ध्वज जोड़ें।
गैर-F2FS सिस्टम
गैर-F2FS सिस्टम के लिए, कर्नेल कॉन्फ़िगरेशन में dm-bow
सक्षम होना चाहिए।
/data
पर माउंट किए गए डिवाइस के लिए fstab के <fs_mgr_flags>
अनुभाग में checkpoint=block
ध्वज जोड़ें।
लॉग जांचें
चेकपॉइंट एपीआई को कॉल करने पर लॉग प्रविष्टियाँ उत्पन्न होती हैं।
मान्यकरण
अपने यूडीसी कार्यान्वयन का परीक्षण करने के लिए, वीटीएस परीक्षणों का VtsKernelCheckpointTest
सेट चलाएं।