Android 12 में, सामान्य boot इमेज को सामान्य कर्नेल इमेज (जीकेआई) कहा जाता है. इसमें सामान्य रैमडिस्क और जीकेआई कर्नेल शामिल होता है.
Android 13 के साथ लॉन्च होने वाले डिवाइसों के लिए, सामान्य ramdisk को boot इमेज से हटा दिया जाता है और इसे अलग init_boot इमेज में रख दिया जाता है. इस बदलाव के बाद, boot इमेज में सिर्फ़ GKI कर्नल रह जाएगा.
Android 12 या कर्नल के पुराने वर्शन का इस्तेमाल करने वाले डिवाइसों को अपग्रेड करने के लिए, सामान्य रैमडिस्क वहीं रहता है जहां वह था. इसके लिए, नई init_boot इमेज की ज़रूरत नहीं होती.
जेनेरिक रैमडिस्क बनाने के लिए, वेंडर के हिसाब से तय किए गए संसाधनों को रैमडिस्क से बाहर ले जाएं. ऐसा करने पर, जेनेरिक रैमडिस्क में सिर्फ़ पहले चरण का init और एक प्रॉपर्टी फ़ाइल होगी. इस फ़ाइल में टाइमस्टैंप की जानकारी होती है.
ऐसे डिवाइसों पर जो:
recoveryपार्टीशन का इस्तेमाल न करें. रिकवरी के सभी बिट, सामान्य रैमडिस्क सेvendor_bootरैमडिस्क में ट्रांसफ़र हो जाते हैं.recoveryपार्टीशन का इस्तेमाल करें.recoveryramdisk में कोई बदलाव करने की ज़रूरत नहीं है, क्योंकिrecoveryramdisk में सब कुछ शामिल होता है.
भवन निर्माण
यहां दिए गए डायग्राम में, Android 12 और इसके बाद के वर्शन वाले डिवाइसों के आर्किटेक्चर के बारे में बताया गया है.
Android 13 के साथ लॉन्च होने वाले डिवाइस में, नई init_boot इमेज होती है. इसमें सामान्य रैमडिस्क होता है.
Android 12 से Android 13 पर अपग्रेड किए गए डिवाइस, Android 12 के आर्किटेक्चर का ही इस्तेमाल करते हैं.
Android 13 के साथ लॉन्च किया गया, रिकवरी के लिए कोई अलग से सिस्टम नहीं है
पहली इमेज. ऐसे डिवाइस जो GKI के साथ Android 13 पर लॉन्च हो रहे हैं या अपग्रेड हो रहे हैं. इनमें रिकवरी के लिए कोई अलग से सुविधा नहीं है.
Android 13 के साथ लॉन्च किया गया, डेडिकेटेड और A/B रिकवरी (डेडिकेटेड रैमडिस्क)
दूसरी इमेज. ऐसे डिवाइस जो Android 13 पर लॉन्च किए जा रहे हैं या अपग्रेड किए जा रहे हैं. इनमें जीकेआई, डेडिकेटेड, और ए/बी रिकवरी की सुविधा उपलब्ध है.
अगर डिवाइस में recovery_a और recovery_b पार्टिशन हैं, तो इस इमेज को देखें.
Android 13 के साथ लॉन्च किया गया, डेडिकेटेड और नॉन-ए/बी रिकवरी (डेडिकेटेड रैमडिस्क)
तीसरी इमेज. ऐसे डिवाइस जो Android 13 पर अपग्रेड हो रहे हैं या लॉन्च हो रहे हैं और जिनमें GKI, डेडिकेटेड, और नॉन-A/B रिकवरी की सुविधा है.
अगर डिवाइस में recovery नाम का कोई ऐसा पार्टिशन है जिसमें स्लॉट सफ़िक्स नहीं है, तो इस इमेज को देखें.
Android 12 के साथ लॉन्च किया गया या Android 12 में अपग्रेड किया गया, रिकवरी के लिए कोई अलग से सुविधा नहीं है
चौथी इमेज. GKI के साथ Android 12 पर लॉन्च या अपग्रेड किए जा रहे डिवाइसों के लिए, कोई खास रिकवरी मोड नहीं है.
Android 12 पर लॉन्च या अपग्रेड करें, डेडिकेटेड और A/B रिकवरी (डेडिकेटेड रैमडिस्क)
पांचवीं इमेज. GKI, डेडिकेटेड, और A/B रिकवरी के साथ Android 12 पर लॉन्च या अपग्रेड किए जा रहे डिवाइस.
अगर डिवाइस में recovery_a और recovery_b पार्टिशन हैं, तो इस इमेज को देखें.
Android 12 को लॉन्च या अपग्रेड करें, डेडिकेटेड और नॉन-ए/बी रिकवरी (डेडिकेटेड रैमडिस्क)
छठी इमेज. Android 12 पर अपग्रेड किए जा रहे या लॉन्च किए जा रहे ऐसे डिवाइस जिनमें GKI, डेडिकेटेड, और नॉन-A/B रिकवरी की सुविधा है.
अगर डिवाइस में recovery नाम का कोई ऐसा पार्टिशन है जिसमें स्लॉट सफ़िक्स नहीं है, तो इस इमेज को देखें.
Android 12 पर अपग्रेड करें, रिकवरी-ऐज़-बूट (रिकवरी-ऐज़-रैमडिस्क)
सातवीं इमेज. Android 12 पर अपग्रेड किए गए डिवाइसों के लिए, जीकेआई नहीं है और रिकवरी-ऐज़-बूट की सुविधा है.
Android 12 पर अपग्रेड करें, डेडिकेटेड रिकवरी (डेडिकेटेड रैमडिस्क)
आठवीं इमेज. Android 12 पर अपग्रेड किए जा रहे डिवाइसों के लिए, जीकेआई नहीं है और रिकवरी के लिए अलग से पार्टीशन है.
बूट इमेज का कॉन्टेंट
Android बूट इमेज में यह कॉन्टेंट शामिल होता है.
Android 13 के साथ लॉन्च होने वाले डिवाइसों के लिए
init_bootइमेज जोड़ी गई- हेडर वर्शन V4
- जेनरिक रैमडिस्क इमेज
जेनरिक
bootइमेज- हेडर वर्शन V3 या
V4
- GKI boot.img सर्टिफ़िकेशन के लिए
boot_signature(सिर्फ़ v4). सर्टिफ़ाइड GKIboot.imgपर, वेरिफ़ाइड बूट के लिए हस्ताक्षर नहीं किया गया है. OEM को अब भी, डिवाइस के हिसाब से AVB कुंजी का इस्तेमाल करके, पहले से बनाए गएboot.imgपर हस्ताक्षर करने होंगे. - सामान्य
cmdline(GENERIC_KERNEL_CMDLINE) - GKI कर्नेल
- GKI boot.img सर्टिफ़िकेशन के लिए
- सामान्य रैमडिस्क इमेज
- सिर्फ़ Android 12 और इससे पहले के वर्शन पर
bootइमेज में शामिल है
- सिर्फ़ Android 12 और इससे पहले के वर्शन पर
- हेडर वर्शन V3 या
V4
vendor_bootइमेज (ज़्यादा जानकारी के लिए, वेंडर बूट पार्टीशन देखें)vendor_bootheader- डिवाइस के हिसाब से
cmdline(BOARD_KERNEL_CMDLINE)
- डिवाइस के हिसाब से
vendor_bootramdisk imagelib/modules- खाता वापस पाने के संसाधन (अगर खाता वापस पाने के लिए कोई खास सुविधा उपलब्ध नहीं है)
dtbइमेज
recoveryइमेज- हेडर वर्शन V2
- अगर ज़रूरी हो, तो डिवाइस के हिसाब से
cmdlineको वापस पाने की सुविधा - नॉन-A/B रिकवरी पार्टिशन के लिए, हेडर का कॉन्टेंट स्टैंडअलोन होना चाहिए. रिकवरी इमेज देखें. उदाहरण के लिए:
cmdlineकोbootऔरvendor_bootcmdlineके साथ नहीं जोड़ा गया है.- अगर ज़रूरी हो, तो हेडर में रिकवरी डीटीबीओ की जानकारी दी जाती है.
- A/B रिकवरी पार्टिशन के लिए, कॉन्टेंट को
bootऔरvendor_bootसे जोड़ा या अनुमान लगाया जा सकता है. उदाहरण के लिए: cmdlineकोbootऔरvendor_bootcmdlineके साथ जोड़ा गया है.- DTBO का पता
vendor_bootहेडर से लगाया जा सकता है.
- अगर ज़रूरी हो, तो डिवाइस के हिसाब से
recoveryramdisk image- खाता वापस पाने से जुड़े संसाधन
- नॉन-A/B रिकवरी पार्टिशन के लिए, रैमडिस्क का कॉन्टेंट स्टैंडअलोन होना चाहिए. रिकवरी इमेज देखें. उदाहरण के लिए:
lib/modulesमें, रिकवरी मोड को बूट करने के लिए ज़रूरी सभी कर्नल मॉड्यूल होने चाहिए- रिकवरी रैमडिस्क में
initहोना चाहिए. - A/B रिकवरी पार्टिशन के लिए, रिकवरी रैमडिस्क को सामान्य और
vendor_bootरैमडिस्क से पहले जोड़ा जाता है. इसलिए, इसे स्टैंडअलोन होने की ज़रूरत नहीं होती. उदाहरण के लिए: lib/modulesमें,vendor_bootरैमडिस्क में मौजूद कर्नेल मॉड्यूल के अलावा, सिर्फ़ वे अतिरिक्त कर्नेल मॉड्यूल शामिल हो सकते हैं जो रिकवरी मोड को बूट करने के लिए ज़रूरी हैं.- ऐसा हो सकता है कि
/initपर सिंबल लिंक मौजूद हो, लेकिन बूट इमेज में मौजूद पहले चरण के/initबाइनरी की वजह से यह लिंक काम न कर रहा हो.
- हेडर वर्शन V2
जेनरिक रैमडिस्क इमेज का कॉन्टेंट
सामान्य रैमडिस्क में ये कॉम्पोनेंट शामिल होते हैं.
initsystem/etc/ramdisk/build.propro.PRODUCT.bootimg.* buildप्रॉप- माउंट पॉइंट के लिए खाली डायरेक्ट्री:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ first_stage_ramdisk/- माउंट पॉइंट के लिए डुप्लीकेट की गई खाली डायरेक्ट्री:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- माउंट पॉइंट के लिए डुप्लीकेट की गई खाली डायरेक्ट्री:
बूट इमेज इंटिग्रेशन
बिल्ड फ़्लैग से यह कंट्रोल किया जाता है कि init_boot, boot, recovery, और vendor_boot इमेज कैसे बनाई जाती हैं. बूलियन बोर्ड वैरिएबल की वैल्यू, स्ट्रिंग true होनी चाहिए या खाली होनी चाहिए (यह डिफ़ॉल्ट वैल्यू है).
TARGET_NO_KERNEL. यह वैरिएबल बताता है कि बिल्ड, पहले से बनी बूट इमेज का इस्तेमाल करता है या नहीं. अगर इस वैरिएबल कोtrueपर सेट किया गया है, तोBOARD_PREBUILT_BOOTIMAGEको पहले से बनी बूट इमेज (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img) की जगह पर सेट करेंBOARD_USES_RECOVERY_AS_BOOT. इस वैरिएबल से पता चलता है कि डिवाइस,bootइमेज के तौर परrecoveryइमेज का इस्तेमाल करता है या नहीं. GKI का इस्तेमाल करते समय, यह वैरिएबल खाली होता है. साथ ही, रिकवरी संसाधनों कोvendor_bootमें ले जाना चाहिए.BOARD_USES_GENERIC_KERNEL_IMAGE. यह वैरिएबल दिखाता है कि बोर्ड, GKI का इस्तेमाल करता है. इस वैरिएबल से sysprops याPRODUCT_PACKAGESपर कोई असर नहीं पड़ता.यह बोर्ड-लेवल का GKI स्विच है. यहां दिए गए सभी वैरिएबल, इस वैरिएबल के हिसाब से काम करते हैं.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. यह वैरिएबल कंट्रोल करता है कि क्या ramdisk रिकवरी के संसाधनों कोvendor_bootके लिए बनाया गया है.trueपर सेट होने पर, रिकवरी के संसाधन सिर्फ़vendor-ramdisk/के लिए बनाए जाते हैं. इन्हेंrecovery/root/के लिए नहीं बनाया जाता.अगर यह फ़ील्ड खाली है, तो रिकवरी के संसाधन सिर्फ़
recovery/root/के लिए बनाए जाते हैं,vendor-ramdisk/के लिए नहीं.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. यह वैरिएबल कंट्रोल करता है कि GSI AVB कुंजियां,vendor_bootके लिए बनाई गई हैं या नहीं.trueपर सेट होने पर, अगरBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:सेट है, तो GSI AVB कुंजियां
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avbके लिए बनाई जाती हैं.Is unset, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
अगर
BOARD_RECOVERY_AS_ROOTकी वैल्यू खाली है, तो:सेट है, तो GSI AVB कुंजियां
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avbके लिए बनाई जाती हैं.Is unset, GSI AVB keys are built to
$ANDROID_PRODUCT_OUT/ramdisk/avb.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. यह वैरिएबल कंट्रोल करता है किrecoveryइमेज में कर्नल है या नहीं. Android 12 के साथ लॉन्च होने वाले और A/Brecoveryपार्टीशन का इस्तेमाल करने वाले डिवाइसों को इस वैरिएबल कोtrueपर सेट करना होगा. Android 12 के साथ लॉन्च होने वाले और नॉन-ए/बी का इस्तेमाल करने वाले डिवाइसों को इस वैरिएबल कोfalseपर सेट करना होगा, ताकि रिकवरी इमेज को अलग से न रखा जाए.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. इस वैरिएबल से यह कंट्रोल किया जाता है कि टारगेट फ़ाइलों मेंIMAGES/के नीचे$OUT/boot*.imgको कॉपी किया जाए या नहीं.aosp_arm64को इस वैरिएबल कोtrueपर सेट करना होगा.अन्य डिवाइसों को इस वैरिएबल को खाली छोड़ना होगा.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. यह वैरिएबल कंट्रोल करता है किinit_boot.imgजनरेट किया गया है या नहीं. साथ ही, यह वैरिएबल साइज़ सेट करता है. इस विकल्प को सेट करने पर, सामान्य रैमडिस्क कोboot.imgके बजायinit_boot.imgमें जोड़ा जाता है. साथ ही, चेन किए गए vbmeta के लिए,BOARD_AVB_INIT_BOOT*वैरिएबल सेट करने पड़ते हैं.
अनुमति वाले कॉम्बिनेशन
| कॉम्पोनेंट या वैरिएबल | रिकवरी पार्टिशन के बिना डिवाइस को अपग्रेड करना | रिकवरी पार्टीशन की मदद से डिवाइस को अपग्रेड करना | रिकवरी पार्टिशन के बिना डिवाइस लॉन्च करना | A/B रिकवरी पार्टिशन वाले डिवाइस को लॉन्च करना | बिना ए/बी रिकवरी पार्टिशन वाले डिवाइस को लॉन्च करना | aosp_arm64 |
|---|---|---|---|---|---|---|
boot शामिल है |
हां | हाँ | हाँ | हाँ | हाँ | हां |
इसमें init_boot (Android 13) शामिल है |
no | no | हां | हाँ | हाँ | हां |
vendor_boot शामिल है |
वैकल्पिक | वैकल्पिक | हां | हाँ | हां | no |
recovery शामिल है |
no | हां | no | हां | हां | no |
BOARD_USES_RECOVERY_AS_BOOT |
true |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_USES_GENERIC_KERNEL_IMAGE |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
खिलाड़ी के लिए कोई मार्कर नहीं है | true या खाली |
खिलाड़ी के लिए कोई मार्कर नहीं है | true या खाली |
true या खाली |
खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
खिलाड़ी के लिए कोई मार्कर नहीं है | > 0 | खिलाड़ी के लिए कोई मार्कर नहीं है | > 0 | > 0 | खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | true |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | true |
true |
true |
खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | true |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | खिलाड़ी के लिए कोई मार्कर नहीं है | true |
जिन डिवाइसों में recovery का अलग पार्टीशन होता है वे PRODUCT_BUILD_RECOVERY_IMAGE को true या खाली पर सेट कर सकते हैं. इन डिवाइसों के लिए, अगर BOARD_RECOVERYIMAGE_PARTITION_SIZE सेट है, तो recovery इमेज बनाई जाती है.
बूट के लिए चेन किए गए vbmeta को चालू करें
boot और init_boot इमेज के लिए, चेन किए गए vbmeta को चालू करना ज़रूरी है. इनके बारे में बताएं:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
उदाहरण के लिए, यह बदलाव देखें.
System-as-root
GKI का इस्तेमाल करने वाले डिवाइसों के लिए, सिस्टम-ऐज़-रूट की सुविधा काम नहीं करती. ऐसे डिवाइसों पर, BOARD_BUILD_SYSTEM_ROOT_IMAGE खाली होना चाहिए. सिस्टम-ऐज़-रूट, डाइनैमिक पार्टीशन का इस्तेमाल करने वाले डिवाइसों के लिए भी काम नहीं करता.
प्रॉडक्ट कॉन्फ़िगरेशन
जेनेरिक रैमडिस्क का इस्तेमाल करने वाले डिवाइसों को, उन फ़ाइलों की सूची इंस्टॉल करनी होगी जिन्हें रैमडिस्क में इंस्टॉल करने की अनुमति है. इसके लिए, device.mk में यह जानकारी दें:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk फ़ाइल, अन्य मेकफ़ाइलों को गलती से रैमडिस्क में अन्य फ़ाइलें इंस्टॉल करने से भी रोकती है. ऐसी फ़ाइलों को generic_ramdisk.mk में ले जाएं.vendor_ramdisk
डिवाइसों को सेट अप करना
Android 13 के साथ लॉन्च होने वाले डिवाइसों, Android 12 पर अपग्रेड करने वाले डिवाइसों, और Android 12 के साथ लॉन्च होने वाले डिवाइसों के लिए, सेटअप करने के निर्देश अलग-अलग होते हैं. Android 13 पर, Android 12 की तरह ही सेट अप किए जाते हैं
Android 12 पर अपग्रेड किए गए डिवाइसों के लिए:
BOARD_USES_RECOVERY_AS_BOOTकी वैल्यू को बनाए रख सकता है. ऐसा करने पर, वे लेगसी कॉन्फ़िगरेशन का इस्तेमाल कर रहे होते हैं और नए बिल्ड वैरिएबल खाली होने चाहिए. अगर ऐसे डिवाइस:BOARD_USES_RECOVERY_AS_BOOTकोtrueपर सेट करें. आर्किटेक्चर तीसरी इमेज में दिखाया गया है.BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट करें. आर्किटेक्चर को चौथी इमेज में दिखाया गया है.
BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट किया जा सकता है. ऐसा करने पर, वे नए कॉन्फ़िगरेशन का इस्तेमाल कर रहे होते हैं. अगर ऐसे डिवाइस:किसी खास
recoveryपार्टीशन का इस्तेमाल न करें. आर्किटेक्चर को पहली इमेज में दिखाया गया है और डिवाइस सेटअप करने का विकल्प पहला विकल्प है.recoveryपार्टीशन का इस्तेमाल करें. इसका आर्किटेक्चर दूसरी इमेज 2a या दूसरी इमेज 2b में दिखाया गया है. साथ ही, डिवाइस सेटअप करने का विकल्प विकल्प 2a या विकल्प 2b है.
Android 12 के साथ लॉन्च होने वाले डिवाइसों को
BOARD_USES_RECOVERY_AS_BOOTको खाली पर सेट करना होगा और नए कॉन्फ़िगरेशन का इस्तेमाल करना होगा. अगर ऐसे डिवाइस:किसी खास
recoveryपार्टीशन का इस्तेमाल न करें. आर्किटेक्चर, पहली इमेज में दिखाए गए तरीके से होना चाहिए. साथ ही, डिवाइस सेटअप करने का विकल्प पहला विकल्प होना चाहिए.recoveryपार्टीशन का इस्तेमाल करें. आर्किटेक्चर इमेज 2a या इमेज 2b में दिखाया गया है. साथ ही, डिवाइस सेटअप करने का विकल्प विकल्प 2a या विकल्प 2b है.
aosp_arm64 सिर्फ़ GKI बनाता है, न कि vendor_boot या रिकवरी. इसलिए, यह पूरा टारगेट नहीं है. aosp_arm64बिल्ड कॉन्फ़िगरेशन के लिए, generic_arm64 देखें.
पहला विकल्प: रिकवरी के लिए कोई अलग पार्टीशन नहीं है
जिन डिवाइसों में recovery पार्टिशन नहीं होता उनमें boot पार्टिशन में, जेनरिक boot इमेज होती है. vendor_boot ramdisk में रिकवरी के सभी संसाधन होते हैं. इनमें lib/modules (वेंडर कर्नल मॉड्यूल के साथ) भी शामिल है. ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
बोर्ड की वैल्यू सेट करना
ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
बाइनरी और सिंबल लिंक शुरू करना
vendor_boot ramdisk में /init से /system/bin/init सिमलंक हो सकता है. साथ ही, init_second_stage.recovery /system/bin/init पर हो सकता है. हालांकि, vendor_boot ramdisk के बाद सामान्य ramdisk को जोड़ा जाता है. इसलिए, /init सिंबल लिंक को बदल दिया जाता है. जब डिवाइस रिकवरी मोड में बूट होता है, तब दूसरे चरण के init को सपोर्ट करने के लिए /system/bin/init बाइनरी की ज़रूरत होती है. vendor_boot + सामान्य रैमडिस्क में यह कॉन्टेंट होता है:
/init(सामान्य रैमडिस्क से, जिसेinit_first_stageसे बनाया गया है)/system/bin/init(vendor_ramdiskसे,init_second_stage.recoveryसे बनाया गया)
fstab फ़ाइलों को दूसरी जगह ले जाना
जेनेरिक रैमडिस्क में इंस्टॉल की गई fstab फ़ाइलों को vendor_ramdisk में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. vendor_ramdisk (अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो इस चरण को छोड़ दें).
जब मॉड्यूल
/first_stage_ramdiskमें इंस्टॉल होता है, तब मॉड्यूल केvendor_ramdiskवैरिएंट का इस्तेमाल करें. यह मॉड्यूल,initके रूट को/first_stage_ramdiskमें स्विच करने के बाद औरinitके रूट को/systemमें स्विच करने से पहले उपलब्ध होना चाहिए. उदाहरण के लिए, मेटाडेटा के चेकसम और वर्चुअल A/B कंप्रेशन देखें.जब मॉड्यूल
/में इंस्टॉल हो, तब मॉड्यूल केrecoveryवैरिएंट का इस्तेमाल करें. यह मॉड्यूल,initके रूट को/first_stage_ramdiskमें स्विच करने से पहले उपलब्ध होना चाहिए./के लिए मॉड्यूल इंस्टॉल करने के बारे में जानकारी पाने के लिए, पहली स्टेज का कंसोल देखें.
पहले चरण का कंसोल
पहली स्टेज का कंसोल, init के रूट को /first_stage_ramdisk में स्विच करने से पहले शुरू होता है. इसलिए, आपको मॉड्यूल का recovery वर्शन इंस्टॉल करना होगा.
डिफ़ॉल्ट रूप से, दोनों मॉड्यूल वैरिएंट build/make/target/product/base_vendor.mk में इंस्टॉल होते हैं. इसलिए, अगर डिवाइस की मेकफ़ाइल उस फ़ाइल से इनहेरिट होती है, तो आपको recovery वैरिएंट को अलग से इंस्टॉल करने की ज़रूरत नहीं है.
रिकवरी मॉड्यूल को साफ़ तौर पर इंस्टॉल करने के लिए, इसका इस्तेमाल करें.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/recovery/root/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/recovery/root/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, यहां दिया गया तरीका अपनाएं.
PRODUCT_PACKAGES += adbd.recovery
इससे यह पक्का होता है कि बताए गए मॉड्यूल $ANDROID_PRODUCT_OUT/recovery/root/system/bin में इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/recovery/root/system/bin, vendor_ramdisk में इंस्टॉल हो जाता है./system/bin
मेटाडेटा चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा
चेकस
को सपोर्ट करने के लिए, जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk
वैरिएंट इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, बदलावों की यह सूची देखें.
वर्चुअल A/B कंप्रेशन
वर्चुअल A/B कंप्रेशन के लिए, snapuserd को vendor_ramdisk पर इंस्टॉल करना ज़रूरी है. डिवाइस को virtual_ab_ota/compression.mk से इनहेरिट करना चाहिए. virtual_ab_ota/compression.mk, snapuserd का vendor_ramdisk वैरिएंट इंस्टॉल करता है.
बूट प्रोसेस में हुए बदलाव
रिकवरी मोड या Android में बूट करने की प्रोसेस में कोई बदलाव नहीं होता. हालांकि, इसमें यह अपवाद शामिल है:
- Ramdisk
build.prop,/second_stage_resourcesमें चला जाता है, ताकि दूसरे चरणinitमें बूट के बिल्ड टाइमस्टैंप को पढ़ा जा सके.
संसाधन, सामान्य रैमडिस्क से vendor_boot रैमडिस्क में ट्रांसफ़र होते हैं. इसलिए, सामान्य रैमडिस्क को vendor_boot रैमडिस्क से जोड़ने पर कोई बदलाव नहीं होता.
e2fsck को उपलब्ध कराएं
डिवाइस के मेकफ़ाइल, यहां से इनहेरिट किए जा सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mkअगर डिवाइस पर वर्चुअल A/B की सुविधा काम करती है, लेकिन कंप्रेशन की सुविधा काम नहीं करती.virtual_ab_ota/compression.mkअगर डिवाइस पर वर्चुअल A/B कंप्रेशन की सुविधा काम करती है.
प्रॉडक्ट की मेकफ़ाइलें, $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck इंस्टॉल करती हैं. रनटाइम के दौरान, पहला चरण init रूट को /first_stage_ramdisk में बदलता है. इसके बाद, /system/bin/e2fsck को लागू करता है.
विकल्प 2a: रिकवरी के लिए अलग से और A/B टेस्टिंग के लिए पार्टीशन
इस विकल्प का इस्तेमाल उन डिवाइसों के लिए करें जिनमें A/B recovery पार्टीशन हैं. इसका मतलब है कि डिवाइस में recovery_a और recovery_b partition है. ऐसे डिवाइसों में A/B और वर्चुअल A/B डिवाइस शामिल हैं. इनके रिकवरी पार्टीशन को अपडेट किया जा सकता है. इनका कॉन्फ़िगरेशन इस तरह से होता है:
AB_OTA_PARTITIONS += recovery
vendor_boot ramdisk में, ramdisk और वेंडर कर्नेल मॉड्यूल के वेंडर बिट शामिल होते हैं. इनमें ये शामिल हैं:
डिवाइस के हिसाब से
fstabफ़ाइलेंlib/modules(इसमें वेंडर कर्नेल मॉड्यूल शामिल हैं)
recovery ramdisk में, रिकवरी के सभी संसाधन होते हैं. ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
बोर्ड की वैल्यू सेट करना
A/B recovery पार्टीशन वाले डिवाइसों के लिए, ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
बाइनरी और सिंबल लिंक शुरू करना
recovery ramdisk में /init -> /system/bin/init सिमलंक और /system/bin/init पर init_second_stage.recovery शामिल हो सकता है. हालांकि, बूट रैमडिस्क को recovery रैमडिस्क के बाद जोड़ा जाता है. इसलिए, /init सिंबल लिंक को बदल दिया जाता है. जब डिवाइस रिकवरी मोड में बूट होता है, तब दूसरे चरण के init को सपोर्ट करने के लिए /system/bin/init
बाइनरी की ज़रूरत होती है.
डिवाइस के recovery में बूट होने पर, recovery + vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(रैमडिस्क से,init_first_stageसे बनाया गया)/system/bin/init(recoveryरैमडिस्क से,init_second_stage.recoveryसे बनाया गया, और/initसे एक्ज़ीक्यूट किया गया)
जब डिवाइस Android में बूट होता है, तब vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(सामान्य रैमडिस्क से, जिसेinit_first_stageसे बनाया गया है)
fstab फ़ाइलों को दूसरी जगह ले जाना
जेनेरिक रैमडिस्क में इंस्टॉल की गई सभी fstab फ़ाइलों को vendor_ramdisk में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
इसके अलावा, डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. vendor_ramdisk (अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो यह चरण छोड़ें). Init
रूट को स्विच नहीं करता है. मॉड्यूल का vendor_ramdisk वैरिएंट, vendor_ramdisk के रूट में इंस्टॉल होता है. vendor_ramdisk में मॉड्यूल इंस्टॉल करने के उदाहरणों के लिए, पहले चरण का कंसोल, मेटाडेटा के चेकसम, और वर्चुअल ए/बी कंप्रेसर देखें.
पहले चरण का कंसोल
मॉड्यूल के vendor_ramdisk वर्शन को इंस्टॉल करने के लिए, इसका इस्तेमाल करें:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, इन मॉड्यूल के vendor_ramdisk वैरिएंट को चालू करें. इसके लिए, AOSP में ज़रूरी पैच अपलोड करें. इसके बाद, यहां दिया गया तरीका अपनाएं,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
इससे यह पक्का होता है कि बताए गए मॉड्यूल, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं. अगर रिकवरी मोड में vendor_boot ramdisk
लोड किया जाता है, तो मॉड्यूल recovery में भी उपलब्ध होता है. अगर रिकवरी मोड में vendor_boot ramdisk लोड नहीं होता है, तो डिवाइस में adbd.recovery को भी इंस्टॉल किया जा सकता है.
मेटाडेटा चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा
चेकस
को सपोर्ट करने के लिए, जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk
वैरिएंट इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, बदलावों की यह सूची देखें.
वर्चुअल A/B कंप्रेशन
वर्चुअल A/B कंप्रेशन के लिए, snapuserd को vendor_ramdisk पर इंस्टॉल किया जाना चाहिए. डिवाइस को virtual_ab_ota/compression.mk से इनहेरिट करना चाहिए. virtual_ab_ota/compression.mk, snapuserd का vendor_ramdisk वैरिएंट इंस्टॉल करता है.
बूट प्रोसेस में हुए बदलाव
Android में बूट करने पर, बूट करने की प्रोसेस में कोई बदलाव नहीं होता. vendor_boot + जेनेरिक रैमडिस्क, बूट करने की मौजूदा प्रोसेस की तरह ही होता है. हालांकि, इसमें fstab, vendor_boot से लोड होता है. system/bin/recovery मौजूद न होने की वजह से,
first_stage_init इसे सामान्य बूट के तौर पर हैंडल करता है.
रिकवरी मोड में बूट करने पर, बूट करने की प्रोसेस बदल जाती है. रिकवरी +
vendor_boot + सामान्य रैमडिस्क, मौजूदा रिकवरी प्रोसेस की तरह ही होती है. हालांकि, इसमें कर्नल को recovery इमेज के बजाय boot इमेज से लोड किया जाता है.
रिकवरी मोड में बूट करने की प्रोसेस यहां दी गई है.
बूटलोडर शुरू होता है. इसके बाद, यह ये काम करता है:
- यह
vendor_bootमें रिकवरी +vendor_boot+ जेनरिक रैमडिस्क को पुश करता है./(अगर ओईएम, रिकवरी रैमडिस्क में कर्नेल मॉड्यूल को डुप्लीकेट करता है, तोBOARD_RECOVERY_KERNEL_MODULESको जोड़ना ज़रूरी नहीं है.)vendor_boot - यह
bootपार्टीशन से कर्नल को चलाता है.
- यह
कर्नेल, रैमडिस्क को
/पर माउंट करता है. इसके बाद, जेनेरिक रैमडिस्क से/initको एक्ज़ीक्यूट करता है.पहले चरण की init प्रोसेस शुरू होती है. इसके बाद, यह प्रोसेस ये काम करती है:
IsRecoveryMode() == trueऔरForceNormalBoot() == falseसेट करता है.- यह
/lib/modulesसे वेंडर कर्नेल मॉड्यूल लोड करता है. - कॉल
DoFirstStageMount()करता है, लेकिन माउंट करने की प्रोसेस को छोड़ देता है, क्योंकिIsRecoveryMode() == true. (डिवाइस, रैमडिस्क को खाली नहीं करता है, क्योंकि/अब भी वही है. हालांकि, यहSetInitAvbVersionInRecovery()को कॉल करता है.) - यह
recoveryramdisk से/system/bin/initसे दूसरे चरण की शुरुआत करता है.
e2fsck को उपलब्ध कराएं
डिवाइस के मेकफ़ाइल, यहां से इनहेरिट किए जा सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mkअगर डिवाइस पर वर्चुअल A/B की सुविधा काम करती है, लेकिन कंप्रेशन की सुविधा काम नहीं करती.virtual_ab_ota/compression.mkअगर डिवाइस पर वर्चुअल A/B कंप्रेशन की सुविधा काम करती है.
प्रॉडक्ट की मेकफ़ाइलें, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck इंस्टॉल करती हैं. रनटाइम के दौरान, पहली स्टेज init को /system/bin/e2fsck किया जाता है.
दूसरा विकल्प: रिकवरी के लिए अलग से बनाया गया और A/B टेस्ट के लिए इस्तेमाल न किया जाने वाला पार्टीशन
इस विकल्प का इस्तेमाल उन डिवाइसों के लिए करें जिनमें नॉन-ए/बी recovery पार्टिशन होता है. इसका मतलब है कि डिवाइस में recovery नाम का एक पार्टिशन होता है, जिसमें स्लॉट सफ़िक्स नहीं होता. इस तरह के डिवाइसों में ये शामिल हैं:
- नॉन-A/B डिवाइसों के लिए;
- A/B और वर्चुअल A/B डिवाइस, जिनमें रिकवरी पार्टीशन को अपडेट नहीं किया जा सकता. (यह असामान्य है.)
vendor_boot ramdisk में, ramdisk और वेंडर कर्नेल मॉड्यूल के वेंडर बिट शामिल होते हैं. इनमें ये शामिल हैं:
- डिवाइस के हिसाब से
fstabफ़ाइलें lib/modules(इसमें वेंडर कर्नेल मॉड्यूल शामिल हैं)
recovery इमेज में सभी ज़रूरी जानकारी होनी चाहिए. इसमें रिकवरी मोड को बूट करने के लिए, सभी ज़रूरी संसाधन शामिल होने चाहिए. जैसे:
- कर्नेल इमेज
- डीटीबीओ इमेज
lib/modulesमें कर्नेल मॉड्यूल- सिमलिंक के तौर पर पहले चरण का इनिट
/init -> /system/bin/init - सेकंड-स्टेज इनिट बाइनरी
/system/bin/init - डिवाइस के हिसाब से
fstabफ़ाइलें - डेटा वापस पाने के लिए अन्य सभी संसाधन, जिनमें
recoveryबाइनरी भी शामिल है
ऐसे डिवाइसों पर, प्रॉडक्ट कॉन्फ़िगरेशन generic_ramdisk.mk से इनहेरिट होता है.
बोर्ड की वैल्यू सेट करना
A/B टेस्टिंग की सुविधा वाले डिवाइसों के लिए, ये वैल्यू सेट करें:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
बाइनरी और सिंबल लिंक शुरू करना
recovery रैमडिस्क में /init -> /system/bin/init सिमलंक और /system/bin/init पर init_second_stage.recovery होना चाहिए. जब डिवाइस रिकवरी मोड में बूट होता है, तब पहले और दूसरे चरण की शुरुआत, दोनों के लिए /system/bin/init बाइनरी की ज़रूरत होती है.
जब डिवाइस recovery में बूट होता है, तब recovery रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init -> /system/bin/init(recoveryरैमडिस्क से)/system/bin/init(recoveryरैमडिस्क से,init_second_stage.recoveryसे बनाया गया, और/initसे एक्ज़ीक्यूट किया गया)
जब डिवाइस Android में बूट होता है, तब vendor_boot + सामान्य रैमडिस्क का कॉन्टेंट इस तरह होता है:
/init(रैमडिस्क से,init_first_stageसे बनाया गया)
fstab फ़ाइलों को दूसरी जगह ले जाना
जेनेरिक रैमडिस्क में इंस्टॉल की गई सभी fstab फ़ाइलों को vendor_ramdisk और recovery रैमडिस्क में ले जाएं. उदाहरण के लिए, यह बदलाव देखें.
मॉड्यूल इंस्टॉल करना
vendor_ramdisk और recovery रैमडिस्क में डिवाइस के हिसाब से मॉड्यूल इंस्टॉल किए जा सकते हैं. अगर आपको डिवाइस के हिसाब से कोई मॉड्यूल इंस्टॉल नहीं करना है, तो यह चरण छोड़ दें. init
रूट को स्विच नहीं करता है. मॉड्यूल का vendor_ramdisk वैरिएंट, vendor_ramdisk के रूट में इंस्टॉल होता है. मॉड्यूल का recovery वैरिएंट, recovery रैमडिस्क के रूट में इंस्टॉल होता है. vendor_ramdisk और recovery रैमडिस्क में मॉड्यूल इंस्टॉल करने के उदाहरणों के लिए, पहले चरण का कंसोल और मेटाडेटा के चेकसम देखें.
पहले चरण का कंसोल
मॉड्यूल के vendor_ramdisk वर्शन को इंस्टॉल करने के लिए, इसका इस्तेमाल करें:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
इससे यह पक्का होता है कि linker, sh, और toybox, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं. इसके बाद, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin, vendor_ramdisk के तहत /system/bin पर इंस्टॉल हो जाता है.
पहले चरण के कंसोल के लिए ज़रूरी मॉड्यूल (उदाहरण के लिए, adbd) जोड़ने के लिए, इन मॉड्यूल के vendor_ramdisk वैरिएंट को चालू करें. इसके लिए, AOSP में ज़रूरी पैच अपलोड करें. इसके बाद, यहां दिया गया तरीका अपनाएं,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
इससे यह पक्का होता है कि बताए गए मॉड्यूल, $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर इंस्टॉल हो जाएं.
मॉड्यूल के recovery वैरिएंट को इंस्टॉल करने के लिए, vendor_ramdisk को recovery से बदलें:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
मेटाडेटा चेकसम
पहले चरण में माउंट करने के दौरान, मेटाडेटा
चेकस
को सपोर्ट करने के लिए, जिन डिवाइसों पर GKI इंस्टॉल नहीं किया जा सकता वे यहां दिए गए मॉड्यूल के ramdisk
वैरिएंट इंस्टॉल करते हैं. GKI के लिए सहायता जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
पहले चरण में रिकवरी के दौरान मेटाडेटा के चेकसम की सुविधा इस्तेमाल करने के लिए, इन मॉड्यूल के रिकवरी वैरिएंट चालू करें और उन्हें इंस्टॉल करें.
बूट प्रोसेस में हुए बदलाव
Android में बूट करने पर, बूट करने की प्रोसेस में कोई बदलाव नहीं होता. vendor_boot + जेनेरिक रैमडिस्क, बूट करने की मौजूदा प्रोसेस की तरह ही होता है. हालांकि, इसमें fstab, vendor_boot से लोड होता है. system/bin/recovery मौजूद न होने की वजह से,
first_stage_init इसे सामान्य बूट के तौर पर हैंडल करता है.
रिकवरी मोड में बूट करने पर, बूट करने की प्रोसेस में कोई बदलाव नहीं होता. रिकवरी रैमडिस्क को उसी तरह से लोड किया जाता है जिस तरह से मौजूदा रिकवरी प्रोसेस में किया जाता है.
कर्नेल को recovery इमेज से लोड किया जाता है. रिकवरी मोड में बूट करने की प्रोसेस यहां दी गई है.
बूटलोडर शुरू होता है. इसके बाद, यह ये काम करता है:
- यह कुकी, रिकवरी रैमडिस्क को
/पर पुश करती है. - यह
recoveryपार्टीशन से कर्नल को चलाता है.
- यह कुकी, रिकवरी रैमडिस्क को
कर्नेल, रैमडिस्क को
/पर माउंट करता है. इसके बाद,/initको एक्ज़ीक्यूट करता है. यहrecoveryरैमडिस्क से/system/bin/initका सिमलंक होता है.पहले चरण की init प्रोसेस शुरू होती है. इसके बाद, यह प्रोसेस ये काम करती है:
IsRecoveryMode() == trueऔरForceNormalBoot() == falseसेट करता है.- यह
/lib/modulesसे वेंडर कर्नेल मॉड्यूल लोड करता है. - कॉल
DoFirstStageMount()करता है, लेकिन माउंट करने की प्रोसेस को छोड़ देता है, क्योंकिIsRecoveryMode() == true. (डिवाइस, रैमडिस्क को खाली नहीं करता है, क्योंकि/अब भी वही है. हालांकि, यहSetInitAvbVersionInRecovery()को कॉल करता है.) - यह
recoveryramdisk से/system/bin/initसे दूसरे चरण की शुरुआत करता है.
बूट इमेज के टाइमस्टैंप
यहां boot इमेज के टाइमस्टैंप वाली फ़ाइल का उदाहरण दिया गया है:
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
बिल्ड टाइम पर,
system/etc/ramdisk/build.propफ़ाइल को सामान्य रैमडिस्क में जोड़ दिया जाता है. इस फ़ाइल में, बिल्ड के टाइमस्टैंप की जानकारी होती है.रनटाइम के दौरान, पहले चरण में
init, रैमडिस्क से फ़ाइलों कोtmpfsमें कॉपी करता है. इसके बाद, रैमडिस्क को खाली कर देता है, ताकि दूसरे चरण मेंinitइस फ़ाइल को पढ़करbootइमेज के टाइमस्टैंप की प्रॉपर्टी सेट कर सके.