Android 11 में सॉफ़्ट रीस्टार्ट की सुविधा काम करती है. यह सुविधा, उपयोगकर्ता स्पेस में प्रोसेस को रनटाइम के दौरान रीस्टार्ट करती है. इसका इस्तेमाल उन अपडेट को लागू करने के लिए किया जाता है जिनके लिए रीबूट करना ज़रूरी होता है. उदाहरण के लिए, APEX पैकेज के अपडेट. फ़िलहाल, सॉफ़्ट रीस्टार्ट की सुविधा सिर्फ़ उन प्रोसेस के लिए उपलब्ध है जो userdata
माउंट होने के बाद शुरू हुई हैं.
सॉफ़्ट रीस्टार्ट का अनुरोध इन तरीकों से किया जाता है:
PowerManager
पर कॉल करके,PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
शेल से,
adb shell svc power reboot userspace
याadb reboot userspace
का इस्तेमाल करके
सॉफ़्ट रीस्टार्ट के बाद, क्रेडेंशियल के लिए एन्क्रिप्ट (सुरक्षित) किया गया स्टोरेज अनलॉक रहता है.
अगर कोई डिवाइस सॉफ़्ट रीस्टार्ट की सुविधा के साथ काम करता है, तो PowerManager.isRebootingUserspace()
एपीआई तरीके से true
मिलता है. साथ ही, सिस्टम प्रॉपर्टी init.userspace_reboot.is_supported
की वैल्यू, 1
के बराबर होती है.
अगर डिवाइस पर सॉफ़्ट रीस्टार्ट की सुविधा काम नहीं करती है, तो PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
, adb reboot
userspace
, और adb shell svc power reboot userspace
पर कॉल नहीं किया जा सकेगा.
सॉफ़्ट रीस्टार्ट एक्ज़ीक्यूशन
PowerManager
या शेल के ज़रिए सॉफ़्ट रीस्टार्ट का अनुरोध करने के बाद, init
ये काम करता है:
sys.powerctl=reboot,userspace
मिलता है.यह कुकी, सॉफ़्ट रीस्टार्ट को मॉनिटर करने के लिए एक अलग
UserspaceRebootWatchdogThread()
प्रोसेस को फ़ोर्क करती है.यह
userspace-reboot-requested
ऐक्शन को ट्रिगर करता है. इससे सिस्टम की उन सभी प्रॉपर्टी को रीसेट किया जाता है जो सॉफ़्ट रीस्टार्ट पर असर डाल सकती हैं. जिन प्रॉपर्टी पर असर पड़ा है:sys.usb.config
sys.usb.state
sys.boot_completed
dev.bootcomplete
sys.init.updatable_crashing
sys.init.updatable_crashing_process_name
apexd.status
sys.user.0.ce_available
sys.shutdown.requested
service.bootanim.exit
बूट सीक्वेंस के दौरान, ऊपर दी गई प्रॉपर्टी को फिर से सेट किया जाना चाहिए. अगर ज़रूरत हो, तो अन्य प्रॉपर्टी रीसेट की जा सकती हैं. उदाहरण के लिए,
rootdir/init.rc
मेंon userspace-reboot-requested
कार्रवाई देखें.DoUserspaceReboot
फ़ंक्शन को चलाता है. यह फ़ंक्शन ये कार्रवाइयां करता है:- यह
SIGTERM
को उन प्रोसेस को भेजता है जोuserdata
के माउंट होने के बाद शुरू हुई हैं. साथ ही, उनके बंद होने का इंतज़ार करता है. - टाइम आउट होने के बाद, यह कुकी
SIGKILL
भेजती है, ताकि चल रही सभी प्रोसेस बंद की जा सकें. /system/bin/vdc volume reset
पर कॉल करता है.- यह zRAM बैकिंग डिवाइस को अनमाउंट करता है.
- इससे चालू APEX पैकेज अनमाउंट किए जाते हैं.
- यह बूटस्ट्रैप माउंट नेमस्पेस पर वापस स्विच करता है.
userspace-reboot-resume
कार्रवाई को ट्रिगर करता है.
- यह
अगर सॉफ़्ट रीस्टार्ट से पहले फ़ाइल सिस्टम चेकपॉइंटिंग का अनुरोध किया गया था, तो userdata
को userspace-reboot-fs-remount
कार्रवाई के दौरान चेकपॉइंटिंग मोड में फिर से माउंट किया जाता है. ज़्यादा जानकारी के लिए, नीचे दिया गया सेक्शन देखें. sys.boot_completed property
को 1
पर सेट करने के बाद, डिवाइस को सॉफ़्ट रीस्टार्ट किया जाता है. सॉफ़्ट रीस्टार्ट के आखिर में, डिसप्ले बंद रहता है. इसे चालू करने के लिए, उपयोगकर्ता को साफ़ तौर पर इंटरैक्ट करना होता है.
फ़ाइल सिस्टम की जांच करना
अगर सॉफ़्ट रीस्टार्ट से पहले फ़ाइल सिस्टम के चेकपॉइंट का अनुरोध किया गया था, तो सॉफ़्ट रीस्टार्ट के दौरान userdata
को चेकपॉइंटिंग मोड में फिर से माउंट किया जाता है.
रीमाउंटिंग लॉजिक को fs_mgr_remount_userdata_into_checkpointing
फ़ंक्शन में लागू किया जाता है. साथ ही, यह चेकपॉइंटिंग के तरीकों के हिसाब से अलग-अलग होता है. खास तौर पर, जब
userdata
इन सुविधाओं के साथ काम करता हो:
फ़ाइल सिस्टम लेवल पर चेकपॉइंटिंग (उदाहरण के लिए,
f2fs
),userdata
कोcheckpoint=disable
विकल्प के साथ फिर से माउंट किया जाता है.ब्लॉक लेवल चेकपॉइंटिंग (उदाहरण के लिए,
ext4
) के बाद,/data
को अनमाउंट कर दिया जाता है. साथ ही, जिन पैरंट डिवाइस मैपर डिवाइसों पर इसे माउंट किया गया था उन्हें मिटा दिया जाता है. इसके बाद,userdata
को उसी कोड पाथ का इस्तेमाल करके माउंट किया जाता है जिसका इस्तेमाल सामान्य चेकपॉइंटिंग बूट में किया जाता है.
अगर क्रेडेंशियल-एन्क्रिप्ट (सीई) और डिवाइस-एन्क्रिप्ट (डीई) कुंजियों को मैनेज करने के लिए, फ़ाइल सिस्टम लेवल की कीरिंग का इस्तेमाल किया जाता है, तो userdata
के अनमाउंट होने के बाद कुंजियां मिट जाती हैं. पासकोड को वापस लाने की अनुमति देने के लिए, फ़ाइल सिस्टम कीरिंग में पासकोड इंस्टॉल करते समय, vold
सेशन-लेवल कीरिंग में भी fscrypt-provisioning
टाइप का वही पासकोड इंस्टॉल करता है. init_user0
को कॉल करने पर, vold
फ़ाइल सिस्टम कीरिंग में कुंजियां फिर से इंस्टॉल करता है.
हार्ड रीबूट पर वापस जाएं
यह पक्का करने के लिए कि सॉफ़्ट रीस्टार्ट करने से डिवाइस इस्तेमाल न किया जा सके, Android 11 में हार्ड रीबूट का फ़ॉलबैक शामिल है. यह तब ट्रिगर होता है, जब इनमें से कोई एक शर्त पूरी हो जाती है:
- जब कोई डिवाइस दिए गए टाइम आउट में सॉफ़्ट रीस्टार्ट (यानी कि
sys.init.userspace_reboot.in_progress=1
) शुरू नहीं कर पाता. - कोई प्रोसेस, तय किए गए टाइम आउट में बंद नहीं होती है.
/system/bin/vdc volume reset
कार्रवाई पूरी नहीं होती.- zRAM डिवाइस को अनमाउंट नहीं किया जा सका.
- चालू एपीईएक्स पैकेज को गलत तरीके से अनमाउंट किया जाता है.
- चेकपॉइंटिंग मोड में
userdata
को फिर से माउंट करने की कोशिश करने पर गड़बड़ी होती है. - डिवाइस, दिए गए टाइम आउट में बूट नहीं हो पाता (यानी कि
sys.boot_completed=1
).
हर डिवाइस के लिए कॉन्फ़िगरेशन
सॉफ़्ट रीस्टार्ट के कुछ पहलुओं को इन प्रॉपर्टी की वैल्यू बदलकर ट्यून किया जा सकता है:
init.userspace_reboot.is_supported
यह कंट्रोल करता है कि कोई डिवाइस कब सॉफ़्ट रीस्टार्ट कर सकता है. अगर इस प्रॉपर्टी की वैल्यूfalse
,0
है या इसे सेट नहीं किया गया है, तो रीस्टार्ट करने के अनुरोध अस्वीकार कर दिए जाते हैं.init.userspace_reboot.sigkill.timeoutmillis
, उन प्रोसेस के लिए टाइम आउट को कंट्रोल करता है जिन्हें बंद करने के लिएSIGKILL
सिग्नल मिला है. टाइम आउट की अवधि मिलीसेकंड में होती है. अगर दी गई समयसीमा में कोई प्रोसेस बंद नहीं होती है, तो हार्ड रीबूट की प्रोसेस शुरू हो जाती है.init.userspace_reboot.sigterm.timeoutmillis
, उन प्रोसेस के लिए टाइम आउट को कंट्रोल करता है जिन्हें बंद करने के लिएSIGTERM
सिग्नल मिला है. टाइम आउट की अवधि मिलीसेकंड में होती है. जिन प्रोसेस को तय समय में खत्म नहीं किया जा सका उन्हेंSIGKILL
सिग्नल मिलता है.init.userspace_reboot.started.timeoutmillis
, सॉफ़्ट रीस्टार्ट शुरू होने के लिए मिलीसेकंड में टाइमआउट को कंट्रोल करता है. इसका मतलब है किsys.init.userspace_reboot.in_progress=1
. अगर कोई डिवाइस दिए गए टाइमआउट में सॉफ़्ट रीस्टार्ट शुरू नहीं कर पाता है, तो हार्ड रीबूट शुरू हो जाता है.init.userspace_reboot.userdata_remount.timeoutmillis
,userdata
को अनमाउंट करने के लिए, टाइम आउट को मिलीसेकंड में कंट्रोल करता है. अगर कोई डिवाइस तय समय में अनमाउंट नहीं होता है, तो हार्ड रीबूट की प्रोसेस शुरू हो जाती है.userdata
init.userspace_reboot.watchdog.timeoutmillis
किसी डिवाइस के बूट होने के लिए टाइमआउट को कंट्रोल करता है. इसका मतलब है किsys.boot_completed=1
. अगर कोई डिवाइस दिए गए टाइमआउट में बूट नहीं होता है, तो हार्ड रीबूट का फ़ॉलबैक ट्रिगर हो जाता है.
सॉफ़्ट रीस्टार्ट के दौरान ऐनिमेशन को पसंद के मुताबिक बनाना
सॉफ़्ट रीस्टार्ट के रेफ़रंस इंप्लीमेंटेशन में, सॉफ़्ट रीस्टार्ट के दौरान दिखने वाले ऐनिमेशन को पसंद के मुताबिक बनाने की सुविधा शामिल होती है.
userspace-reboot-fs-remount
कार्रवाई के आखिर में, init
bootanim
सेवा शुरू करता है. यह सेवा, यहां दी गई क्रम के हिसाब से ऐनिमेशन फ़ाइलों को ढूंढती है. साथ ही, जो फ़ाइल सबसे पहले मिलती है उसे चलाती है:
/product/media/userspace-reboot.zip
/oem/media/userspace-reboot.zip
/system/media/userspace-reboot.zip
अगर किसी खास एनिमेशन फ़ाइल के लिए सॉफ्ट रीस्टार्ट करने का विकल्प नहीं चुना जाता है, तो bootanim
में डिफ़ॉल्ट android
एनिमेशन दिखता है.
टेस्ट करना
Android 11 में, सॉफ़्ट रीस्टार्ट को लागू करने का एक रेफ़रंस शामिल है. इसके अलावा, UserspaceRebootHostTest
में सीटीएस टेस्ट का इस्तेमाल करके, सॉफ़्ट रीस्टार्ट की पुष्टि की जा सकती है.