Android 10 में उपयोगकर्ता डेटा चेकपॉइंट (यूडीसी) की सुविधा जोड़ी गई है. इससे, Android ओवर-द-एयर (ओटीए) अपडेट पूरा न होने पर, Android को उसकी पिछली स्थिति पर वापस लाया जा सकता है. यूडीसी की मदद से, अगर Android ओटीए अपडेट पूरा नहीं हो पाता है, तो डिवाइस को सुरक्षित तरीके से उसकी पिछली स्थिति पर वापस लाया जा सकता है. हालांकि
A/B अपडेट की मदद से, यह समस्या हल की जा सकती है. ऐसा करने से पहले बूट करने, रोलबैक करने, और इस्तेमाल करने में यह समस्या आ सकती है
उपयोगकर्ता के डेटा के पार्टीशन (/data
पर माउंट किया गया) में बदलाव होने पर, काम नहीं करता.
यूडीसी की मदद से डिवाइस, उपयोगकर्ता के डेटा के बंटवारे को वापस ला सकता है. भले ही, वह संशोधित. यूडीसी की सुविधा, फ़ाइल सिस्टम में चेकपॉइंट की सुविधाओं की मदद से ऐसा करती है. यह सुविधा, फ़ाइल सिस्टम में चेकपॉइंट की सुविधा न होने पर, एक वैकल्पिक तरीके से काम करती है. साथ ही, यह बूटलोडर के A/B सिस्टम के साथ इंटिग्रेट होती है. हालांकि, यह A/B के अलावा अन्य अपडेट के साथ भी काम करती है. साथ ही, यह पासकोड के वर्शन को बांधने और पासकोड को रोलबैक होने से रोकने की सुविधा के साथ भी काम करती है.
उपयोगकर्ता पर असर
यूडीसी की सुविधा से, उपयोगकर्ताओं को ओटीए अपडेट का बेहतर अनुभव मिलता है. ऐसा इसलिए, क्योंकि ओटीए अपडेट न होने पर, कम उपयोगकर्ताओं का डेटा मिटता है. इससे सहायता कॉल की संख्या कम हो सकती है जिन्हें अपडेट प्रोसेस के दौरान समस्याएं होती हैं. हालांकि, ओटीए अपडेट न होने पर, उपयोगकर्ताओं को डिवाइस कई बार रीबूट होते हुए दिख सकता है.
यह कैसे काम करता है
अलग-अलग फ़ाइल सिस्टम में चेकपॉइंट की सुविधा
F2FS फ़ाइल सिस्टम के लिए, यूडीसी अपस्ट्रीम में चेकपॉइंट फ़ंक्शन जोड़ता है 4.20 Linux कर्नेल और इसे डिवाइस पर काम करने वाले सभी सामान्य कर्नेल पर बैकपोर्ट करता है Android 10 वर्शन पर चल रहे हैं.
अन्य फ़ाइल सिस्टम के लिए, यूडीसी, चेकपॉइंट की सुविधा के लिए, dm_bow
नाम के डिवाइस मैपर वर्चुअल डिवाइस का इस्तेमाल करता है. dm_bow
, डिवाइस और फ़ाइल के बीच में है
सिस्टम. जब कोई पार्टीशन माउंट किया जाता है, तो ट्रिम जारी किया जाता है. इससे फ़ाइल सिस्टम, सभी खाली ब्लॉक पर ट्रिम कमांड जारी करता है. dm_bow
, इन ट्रिम और इस्तेमाल में रुकावट डालता है
ताकि वे बिना किसी शुल्क के ब्लॉक सूची बना सकें. पढ़ने और लिखने के बाद, डिवाइस पर भेज दिया जाता है
कोई बदलाव नहीं किया गया है, लेकिन डेटा में बदलाव करने की अनुमति नहीं है, लेकिन डेटा वापस लाने के लिए ज़रूरी डेटा का बैक अप ले लिया जाता है
एक फ़्री ब्लॉक तक.
Checkpoint की प्रोसेस
checkpoint=fs/block
फ़्लैग वाला सेगमेंट माउंट करने पर, Android कॉल
डिवाइस को मौजूदा स्टोरेज को वापस लाने के लिए, ड्राइव पर restoreCheckpoint
मौजूद है
COVID-19 की जांच के लिए बनी है. इसके बाद init
, needsCheckpoint
फ़ंक्शन को कॉल करके यह पता लगाता है कि क्या
डिवाइस या तो बूटलोडर A/B स्थिति में है या उसे अपडेट करने की फिर से कोशिश करने के लिए सेट किया गया है
संख्या. अगर इनमें से कोई एक सही है, तो Android, माउंट फ़्लैग जोड़ने या dm_bow
डिवाइस बनाने के लिए createCheckpoint
को कॉल करता है.
पार्टीशन को माउंट करने के बाद, ट्रिम करने के लिए चेकपॉइंट कोड को कॉल किया जाता है.
इसके बाद, बूट प्रोसेस सामान्य तरीके से जारी रहती है. LOCKED_BOOT_COMPLETE
पर, Android, मौजूदा चेकपॉइंट को कमिट करने के लिए commitCheckpoint
को कॉल करता है और अपडेट सामान्य तरीके से जारी रहता है.
कीमास्टर कुंजियां प्रबंधित करें
कीमास्टर कुंजियों का इस्तेमाल डिवाइस एन्क्रिप्शन या दूसरे कामों के लिए किया जाता है. इन्हें मैनेज करने के लिए पासकोड तय करने तक, Android, पासकोड मिटाने वाले कॉल में देरी करता है.
सेहत की निगरानी करना
हेल्थ डेमन यह पुष्टि करता है कि चेकपॉइंट बनाने के लिए, डिस्क में ज़रूरत के मुताबिक जगह है या नहीं. हेल्थ डेमन, Checkpoint.cpp
में cp_healthDaemon
में मौजूद होता है.
हेल्थ डीमन के ये व्यवहार कॉन्फ़िगर किए जा सकते हैं:
ro.sys.cp_msleeptime
: यह नीति कंट्रोल करती है कि डिवाइस कितनी बार डिस्क के इस्तेमाल की जांच करता है.ro.sys.cp_min_free_bytes
: इससे यह तय होता है कि हेल्थ डेमन कम से कम कौनसी वैल्यू देखेगा.ro.sys.cp_commit_on_full
: यह कंट्रोल करता है कि हेल्थ डेमन, डिवाइस को फिर से चालू करता है या डिस्क भर जाने पर, चेकपॉइंट को लागू करता है और प्रोसेस जारी रखता है.
Checkpoint एपीआई
चेकपॉइंट एपीआई का इस्तेमाल, यूडीसी सुविधा करती है. यूडीसी की ओर से इस्तेमाल किए जाने वाले दूसरे एपीआई के लिए, यहां देखें
IVold.aidl
.
अमान्य startCheckpoint(फिर से कोशिश करें)
एक चेकपॉइंट बनाता है.
अपडेट शुरू करने के लिए, फ़्रेमवर्क इस तरीके को कॉल करता है. कॉन्टेंट बनाने
चेकपॉइंट बनाया जाता है, तो चेकपॉइंट वाले फ़ाइल सिस्टम, जैसे कि userdata
डिवाइस को फिर से चालू करने के बाद, R/W माउंट किया गया. अगर फिर से कोशिश करने की संख्या पॉज़िटिव होती है, तो एपीआई
फिर से कोशिश करता है और अपडेटर, needsRollback
को कॉल करके पता लगाता है कि रोल बैक हुआ है या नहीं
अपडेट करना ज़रूरी है. अगर फिर से कोशिश करने की संख्या -1
है, तो एपीआई A/B bootloader के फ़ैसले पर निर्भर करता है.
सामान्य A/B अपडेट करते समय, यह तरीका कॉल नहीं किया जाता.
void commitChanges()
बदलाव लागू करता है.
फ़्रेमवर्क, रीबूट के बाद इस तरीके को कॉल करता है, जब बदलाव लागू करने के लिए तैयार हों. यह डेटा (जैसे चित्र, वीडियो, एसएमएस, सर्वर) से पहले कॉल किया जाता है
रसीद की रसीद), उपयोगकर्ता के डेटा में BootComplete
से पहले लिखी जाती है.
अगर कोई ऐक्टिव चेकपॉइंट अपडेट मौजूद नहीं है, तो इस तरीके से कोई असर नहीं पड़ता.
abortChanges()
डिवाइस को रीबूट करता है और उसे चेकपॉइंट पर वापस ले जाता है. पहले रीबूट के बाद से, उपयोगकर्ता डेटा में किए गए सभी बदलावों को हटा देता है.
फ़्रेमवर्क, रीबूट के बाद, लेकिन 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 वर्शन चेकपॉइंट का इस्तेमाल करता है. ज़्यादा जानकारी के लिए, अलग-अलग फ़ाइल सिस्टम का इस्तेमाल करते हैं.
इसके लिए fstab के <fs_mgr_flags>
सेक्शन में checkpoint=fs
फ़्लैग जोड़ें
डिवाइस /data
पर माउंट किया गया.
नॉन-F2FS सिस्टम
गैर-F2FS सिस्टम के लिए, dm-bow
कर्नेल कॉन्फ़िगरेशन में चालू होना चाहिए.
/data
पर माउंट किए गए डिवाइस के लिए, fstab के <fs_mgr_flags>
सेक्शन में checkpoint=block
फ़्लैग जोड़ें.
लॉग देखें
Checkpoint API को कॉल करने पर, लॉग एंट्री जनरेट होती हैं.
पुष्टि करें
यूडीसी लागू करने की जांच करने के लिए, VtsKernelCheckpointTest
वीटीएस जांच का सेट चलाएं.