एंड्रॉइड 12 में, जेनेरिक boot
इमेज, जिसे जेनेरिक कर्नेल इमेज (जीकेआई) कहा जाता है, में जेनेरिक रैमडिस्क और जीकेआई कर्नेल शामिल हैं।
एंड्रॉइड 13 के साथ लॉन्च होने वाले उपकरणों के लिए, सामान्य रैमडिस्क को boot
छवि से हटा दिया जाता है और एक अलग init_boot
छवि में रखा जाता है। यह परिवर्तन boot
छवि को केवल GKI कर्नेल के साथ छोड़ देता है।
एंड्रॉइड 12 या पुराने कर्नेल संस्करणों का उपयोग जारी रखने वाले उपकरणों को अपग्रेड करने के लिए, जेनेरिक रैमडिस्क वहीं रहता है जहां यह नई init_boot
छवि की कोई आवश्यकता नहीं थी।
एक जेनेरिक रैमडिस्क बनाने के लिए, विक्रेता-विशिष्ट संसाधनों को रैमडिस्क से बाहर ले जाएं, ताकि जेनेरिक रैमडिस्क में केवल पहला चरण init
और एक प्रॉपर्टी फ़ाइल हो जिसमें टाइमस्टैम्प जानकारी हो।
उन उपकरणों पर:
समर्पित
recovery
विभाजन का उपयोग न करें, सभी पुनर्प्राप्ति बिट्स जेनेरिक रैमडिस्क सेvendor_boot
रैमडिस्क पर चले जाते हैं।एक समर्पित
recovery
विभाजन का उपयोग करें,recovery
रैमडिस्क में कोई बदलाव की आवश्यकता नहीं है क्योंकिrecovery
रैमडिस्क स्व-निहित है।
वास्तुकला
निम्नलिखित चित्र Android 12 और इसके बाद के संस्करण चलाने वाले उपकरणों के लिए आर्किटेक्चर को दर्शाते हैं। एंड्रॉइड 13 के साथ लॉन्च होने वाले डिवाइस में एक नई init_boot
छवि है जिसमें जेनेरिक रैमडिस्क है। एंड्रॉइड 12 से एंड्रॉइड 13 में अपग्रेड करने वाले डिवाइस उसी आर्किटेक्चर का उपयोग करते हैं जैसा उन्होंने एंड्रॉइड 12 के साथ किया था।
Android 13 के साथ लॉन्च करें, कोई समर्पित पुनर्प्राप्ति नहीं
चित्र 1. जीकेआई के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले डिवाइस, कोई समर्पित पुनर्प्राप्ति नहीं
Android 13, समर्पित और A/B पुनर्प्राप्ति (समर्पित रैमडिस्क) के साथ लॉन्च करें
चित्र 2. जीकेआई, समर्पित और ए/बी रिकवरी के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले डिवाइस
यदि डिवाइस में recovery_a
और recovery_b
विभाजन हैं तो इस आंकड़े को देखें।
Android 13 के साथ लॉन्च, समर्पित और गैर-ए/बी पुनर्प्राप्ति (समर्पित रैमडिस्क)
चित्र 3. जीकेआई, समर्पित और गैर-ए/बी पुनर्प्राप्ति के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले उपकरण
यदि डिवाइस में स्लॉट प्रत्यय के बिना recovery
नामक विभाजन है तो इस आंकड़े को देखें।
Android 12 लॉन्च करें या अपग्रेड करें, कोई समर्पित पुनर्प्राप्ति नहीं
चित्र 4. जीकेआई के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले डिवाइस, कोई समर्पित पुनर्प्राप्ति नहीं
एंड्रॉइड 12 में लॉन्च या अपग्रेड करें, समर्पित और ए/बी रिकवरी (समर्पित रैमडिस्क)
चित्र 5. जीकेआई, समर्पित और ए/बी रिकवरी के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले डिवाइस
यदि डिवाइस में recovery_a
और recovery_b
विभाजन हैं तो इस आंकड़े को देखें।
एंड्रॉइड 12 में लॉन्च या अपग्रेड करें, समर्पित और गैर-ए/बी रिकवरी (समर्पित रैमडिस्क)
चित्र 6. जीकेआई, समर्पित और गैर-ए/बी पुनर्प्राप्ति के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले उपकरण
यदि डिवाइस में स्लॉट प्रत्यय के बिना recovery
नामक विभाजन है तो इस आंकड़े को देखें।
एंड्रॉइड 12 में अपग्रेड करें, रिकवरी-एज़-बूट (रिकवरी-एज़-रैमडिस्क)
चित्र 7. Android 12 में अपग्रेड होने वाले उपकरण, कोई GKI नहीं, रिकवरी-एज़-बूट
Android 12 में अपग्रेड करें, समर्पित पुनर्प्राप्ति (समर्पित रैमडिस्क)
चित्र 8. Android 12 में अपग्रेड होने वाले उपकरण, कोई GKI नहीं, समर्पित पुनर्प्राप्ति
छवियाँ सामग्री बूट करें
एंड्रॉइड बूट छवियों में निम्नलिखित शामिल हैं।
Android 13 के साथ लॉन्च होने वाले उपकरणों के लिए
init_boot
छवि जोड़ी गई- हेडर संस्करण V4
- सामान्य रैमडिस्क छवि
सामान्य
boot
छवि- हेडर संस्करण V3 या V4
- GKI Boot.img प्रमाणन के लिए एक
boot_signature
(केवल v4)। प्रमाणित GKIboot.img
सत्यापित बूट के लिए हस्ताक्षरित नहीं है। ओईएम को अभी भी डिवाइस-विशिष्ट AVB कुंजी के साथ प्रीबिल्टboot.img
पर हस्ताक्षर करना होगा। - सामान्य
cmdline
(GENERIC_KERNEL_CMDLINE
) - जीकेआई कर्नेल
- GKI Boot.img प्रमाणन के लिए एक
- सामान्य रैमडिस्क छवि
- केवल Android 12 और उससे पहले की
boot
छवियों में शामिल है
- केवल Android 12 और उससे पहले की
- हेडर संस्करण V3 या V4
vendor_boot
छवि (विवरण के लिए, विक्रेता बूट विभाजन देखें)-
vendor_boot
हेडर- डिवाइस-विशिष्ट
cmdline
(BOARD_KERNEL_CMDLINE
)
- डिवाइस-विशिष्ट
-
vendor_boot
रैमडिस्क छवि-
lib/modules
- पुनर्प्राप्ति संसाधन (यदि कोई समर्पित पुनर्प्राप्ति नहीं है)
-
-
dtb
छवि
-
recovery
छवि- हेडर संस्करण V2
- यदि आवश्यक हो तो पुनर्प्राप्ति के लिए डिवाइस-विशिष्ट
cmdline
- गैर-ए/बी पुनर्प्राप्ति विभाजन के लिए, हेडर की सामग्री स्टैंडअलोन होनी चाहिए; पुनर्प्राप्ति छवियाँ देखें। उदाहरण के लिए:
-
cmdline
boot
औरvendor_boot
cmdline
से संयोजित नहीं है। - यदि आवश्यक हो तो हेडर पुनर्प्राप्ति DTBO को निर्दिष्ट करता है।
- ए/बी पुनर्प्राप्ति विभाजन के लिए, सामग्री को
boot
औरvendor_boot
से संयोजित या अनुमानित किया जा सकता है। उदाहरण के लिए: -
cmdline
कोboot
औरvendor_boot
cmdline
से संयोजित किया गया है। - DTBO का अनुमान
vendor_boot
हेडर से लगाया जा सकता है।
- यदि आवश्यक हो तो पुनर्प्राप्ति के लिए डिवाइस-विशिष्ट
-
recovery
रैमडिस्क छवि- पुनर्प्राप्ति संसाधन
- गैर-ए/बी पुनर्प्राप्ति विभाजन के लिए, रैमडिस्क की सामग्री स्टैंडअलोन होनी चाहिए; पुनर्प्राप्ति छवियाँ देखें। उदाहरण के लिए:
-
lib/modules
पुनर्प्राप्ति मोड को बूट करने के लिए आवश्यक सभी कर्नेल मॉड्यूल शामिल होने चाहिए - पुनर्प्राप्ति रैमडिस्क में
init
अवश्य होना चाहिए। - ए/बी रिकवरी विभाजन के लिए, रिकवरी रैमडिस्क को जेनेरिक और
vendor_boot
रैमडिस्क से जोड़ा जाता है, इसलिए इसे स्टैंडअलोन होने की आवश्यकता नहीं है। उदाहरण के लिए: -
lib/modules
मेंvendor_boot
रैमडिस्क में कर्नेल मॉड्यूल के अलावा रिकवरी मोड को बूट करने के लिए आवश्यक केवल अतिरिक्त कर्नेल मॉड्यूल शामिल हो सकते हैं। -
/init
पर सिम्लिंक मौजूद हो सकता है, लेकिन यह बूट छवि में प्रथम-चरण/init
बाइनरी द्वारा ढका हुआ है।
- हेडर संस्करण V2
सामान्य रैमडिस्क छवि सामग्री
जेनेरिक रैमडिस्क में निम्नलिखित घटक होते हैं।
-
init
-
system/etc/ramdisk/build.prop
जोड़ा गया -
ro. 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
। यह वेरिएबल इंगित करता है कि डिवाइसrecovery
छवि कोboot
छवि के रूप में उपयोग करता है या नहीं। GKI का उपयोग करते समय, यह वेरिएबल खाली है और पुनर्प्राप्ति संसाधनों कोvendor_boot
पर ले जाया जाना चाहिए।BOARD_USES_GENERIC_KERNEL_IMAGE
. यह वेरिएबल इंगित करता है कि बोर्ड GKI का उपयोग करता है। यह वेरिएबल sysprops याPRODUCT_PACKAGES
प्रभावित नहीं करता है।यह बोर्ड-स्तरीय GKI स्विच है; नीचे सूचीबद्ध सभी चर इस चर द्वारा प्रतिबंधित हैं।
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
। यह वेरिएबल नियंत्रित करता है कि रैमडिस्क पुनर्प्राप्ति संसाधन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
पर बनाई गई हैं।सेट नहीं है, GSI AVB कुंजियाँ
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
पर बनाई गई हैं।
खाली होने पर, यदि
BOARD_RECOVERY_AS_ROOT
:सेट है, GSI AVB कुंजियाँ
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
पर बनाई गई हैं।सेट नहीं है, GSI AVB कुंजियाँ
$ANDROID_PRODUCT_OUT/ramdisk/avb
पर बनाई गई हैं।
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. यह वेरिएबल नियंत्रित करता है किrecovery
छवि में कर्नेल है या नहीं। एंड्रॉइड 12 के साथ लॉन्च होने वाले और ए/बीrecovery
पार्टीशन का उपयोग करने वाले डिवाइस को इस वेरिएबल कोtrue
पर सेट करना होगा। एंड्रॉइड 12 के साथ लॉन्च होने वाले और गैर-ए/बी का उपयोग करने वाले उपकरणों को पुनर्प्राप्ति छवि को स्व-निहित रखने के लिए इस चर कोfalse
पर सेट करना होगा।BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
। यह वेरिएबल नियंत्रित करता है कि$OUT/boot*.img
को लक्ष्य फ़ाइलों के अंतर्गतIMAGES/
में कॉपी किया गया है या नहीं।aosp_arm64
इस वेरिएबल कोtrue
पर सेट करना होगा।अन्य उपकरणों को इस वेरिएबल को खाली छोड़ना होगा।
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. यह वेरिएबल नियंत्रित करता है किinit_boot.img
उत्पन्न हुआ है या नहीं और आकार निर्धारित करता है। सेट होने पर, सामान्य रैमडिस्क कोboot.img
के बजायinit_boot.img
में जोड़ा जाता है और जंजीर vbmeta के लिएBOARD_AVB_INIT_BOOT*
वेरिएबल सेट करने की आवश्यकता होती है
अनुमत संयोजन
घटक या चर | recovery विभाजन के बिना डिवाइस को अपग्रेड करना | recovery विभाजन के साथ डिवाइस को अपग्रेड करना | recovery विभाजन के बिना डिवाइस लॉन्च करें | ए/बी recovery विभाजन के साथ डिवाइस लॉन्च करें | गैर-ए/बी recovery विभाजन के साथ डिवाइस लॉन्च करें | aosp_arm64 |
---|---|---|---|---|---|---|
boot शामिल है | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ |
इसमें init_boot शामिल है (एंड्रॉइड 13) | नहीं | नहीं | हाँ | हाँ | हाँ | हाँ |
vendor_boot शामिल है | वैकल्पिक | वैकल्पिक | हाँ | हाँ | हाँ | नहीं |
recovery शामिल है | नहीं | हाँ | नहीं | हाँ | हाँ | नहीं |
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
छवि बनाई जाती है।
बूट के लिए शृंखलाबद्ध वीबीमेटा सक्षम करें
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
उदाहरण के लिए, इस परिवर्तन को देखें.
सिस्टम-एज़-रूट
GKI का उपयोग करने वाले उपकरणों के लिए सिस्टम-एज़-रूट समर्थित नहीं है। ऐसे उपकरणों पर, BOARD_BUILD_SYSTEM_ROOT_IMAGE
खाली होना चाहिए। सिस्टम-एज़-रूट उन उपकरणों के लिए भी समर्थित नहीं है जो गतिशील विभाजन का उपयोग करते हैं।
उत्पाद विन्यास
जेनेरिक रैमडिस्क का उपयोग करने वाले उपकरणों को उन फ़ाइलों की एक सूची स्थापित करनी होगी जिन्हें रैमडिस्क पर स्थापित करने की अनुमति है। ऐसा करने के लिए, device.mk
में निम्नलिखित निर्दिष्ट करें:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk
फ़ाइल अन्य मेकफ़ाइलों को गलती से अन्य फ़ाइलों को रैमडिस्क पर स्थापित करने से भी रोकती है (इसके बजाय ऐसी फ़ाइलों को vendor_ramdisk
पर ले जाएँ)।
उपकरण स्थापित करना
एंड्रॉइड 13 के साथ लॉन्च होने, एंड्रॉइड 12 में अपग्रेड करने और एंड्रॉइड 12 के साथ लॉन्च होने वाले उपकरणों के बीच सेटअप निर्देश भिन्न होते हैं। एंड्रॉइड 13, सेटअप उसी तरह है जैसे वे एंड्रॉइड 12 के साथ थे
Android 12 में अपग्रेड होने वाले उपकरण:
BOARD_USES_RECOVERY_AS_BOOT
का मान सुरक्षित रख सकते हैं. यदि वे ऐसा करते हैं, तो वे लीगेसी कॉन्फ़िगरेशन का उपयोग कर रहे हैं और नए बिल्ड वेरिएबल खाली होने चाहिए। यदि ऐसे उपकरण:BOARD_USES_RECOVERY_AS_BOOT
को खाली करने के लिए सेट कर सकते हैं। यदि वे ऐसा करते हैं, तो वे नई कॉन्फ़िगरेशन का उपयोग कर रहे हैं। यदि ऐसे उपकरण:
Android 12 के साथ लॉन्च होने वाले उपकरणों को
BOARD_USES_RECOVERY_AS_BOOT
को खाली करने और नए कॉन्फ़िगरेशन का उपयोग करने के लिए सेट करना होगा। यदि ऐसे उपकरण:
चूँकि aosp_arm64
केवल GKI बनाता है (और vendor_boot
या रिकवरी नहीं), यह पूर्ण लक्ष्य नहीं है। aosp_arm64
बिल्ड कॉन्फ़िगरेशन के लिए, generic_arm64
देखें।
विकल्प 1: कोई समर्पित पुनर्प्राप्ति विभाजन नहीं
recovery
विभाजन के बिना डिवाइस में boot
विभाजन में सामान्य boot
छवि होती है। vendor_boot
रैमडिस्क में 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
रैमडिस्क में /init
से /system/bin/init
सिम्लिंक और /system/bin/init
पर init_second_stage.recovery
हो सकता है। हालाँकि, क्योंकि जेनेरिक रैमडिस्क को vendor_boot
रैमडिस्क के बाद संयोजित किया गया है, /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
में स्विच करने से पहले उपलब्ध होना चाहिए। उदाहरण के लिए, मेटाडेटा चेकसम और वर्चुअल ए/बी कम्प्रेशन देखें।जब मॉड्यूल
/
पर इंस्टॉल हो जाए तो मॉड्यूल के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
पर इंस्टॉल हो जाते हैं, जो फिर vendor_ramdisk
के तहत /system/bin
पर इंस्टॉल हो जाते हैं।
पहले चरण के कंसोल के लिए आवश्यक मॉड्यूल जोड़ने के लिए (उदाहरण के लिए, एडीबीडी), निम्नलिखित का उपयोग करें।
PRODUCT_PACKAGES += adbd.recovery
यह सुनिश्चित करता है कि निर्दिष्ट मॉड्यूल $ANDROID_PRODUCT_OUT/recovery/root/system/bin
पर इंस्टॉल हो जाता है, जो फिर vendor_ramdisk
के तहत /system/bin
पर इंस्टॉल हो जाता है।
मेटाडेटा चेकसम
प्रथम चरण माउंट के दौरान मेटाडेटा चेकसम का समर्थन करने के लिए, जो डिवाइस GKI का समर्थन नहीं करते हैं वे निम्नलिखित मॉड्यूल के रैमडिस्क संस्करण को स्थापित करते हैं। GKI के लिए समर्थन जोड़ने के लिए, मॉड्यूल $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, इस परिवर्तन सूची को देखें।
आभासी ए/बी संपीड़न
वर्चुअल ए/बी कम्प्रेशन का समर्थन करने के लिए, snapuserd
vendor_ramdisk
पर स्थापित किया जाना चाहिए। डिवाइस को virtual_ab_ota/compression.mk
से इनहेरिट करना चाहिए, जो snapuserd
का vendor_ramdisk
वैरिएंट इंस्टॉल करता है।
बूट प्रक्रिया में परिवर्तन
निम्नलिखित अपवादों के साथ पुनर्प्राप्ति या एंड्रॉइड में बूट करने की प्रक्रिया नहीं बदलती है:
- रैमडिस्क
build.prop
/second_stage_resources
में चला जाता है ताकि दूसरे चरण काinit
बूट के बिल्ड टाइमस्टैम्प को पढ़ सके।
क्योंकि संसाधन जेनेरिक रैमडिस्क से vendor_boot
रैमडिस्क में चले जाते हैं, जेनेरिक रैमडिस्क को vendor_boot
रैमडिस्क में जोड़ने का परिणाम नहीं बदलता है।
e2fsck उपलब्ध कराया जा रहा है
डिवाइस मेकफ़ाइल्स इनहेरिट कर सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
यदि डिवाइस वर्चुअल ए/बी का समर्थन करता है लेकिन संपीड़न का नहीं।virtual_ab_ota/compression.mk
यदि डिवाइस वर्चुअल ए/बी कंप्रेशन का समर्थन करता है।
उत्पाद मेकफ़ाइलें $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
इंस्टॉल करती हैं। रनटाइम पर, पहला चरण init
रूट को /first_stage_ramdisk
में स्विच करता है और फिर /system/bin/e2fsck
निष्पादित करता है।
विकल्प 2ए: समर्पित और ए/बी पुनर्प्राप्ति विभाजन
ए/बी recovery
विभाजन वाले उपकरणों के लिए इस विकल्प का उपयोग करें; अर्थात्, डिवाइस में एक recovery_a
और recovery_b partition
है। ऐसे उपकरणों में ए/बी और वर्चुअल ए/बी डिवाइस शामिल हैं जिनका पुनर्प्राप्ति विभाजन निम्नलिखित कॉन्फ़िगरेशन के साथ अद्यतन करने योग्य है:
AB_OTA_PARTITIONS += recovery
vendor_boot
रैमडिस्क में रैमडिस्क और वेंडर कर्नेल मॉड्यूल के विक्रेता बिट्स शामिल हैं, जिनमें निम्नलिखित शामिल हैं:
डिवाइस-विशिष्ट
fstab
फ़ाइलेंlib/modules
(विक्रेता कर्नेल मॉड्यूल शामिल हैं)
recovery
रैमडिस्क में सभी पुनर्प्राप्ति संसाधन शामिल हैं। ऐसे उपकरणों पर, उत्पाद कॉन्फ़िगरेशन generic_ramdisk.mk
से प्राप्त होता है ।
बोर्ड मान सेट करना
ए/बी 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
रैमडिस्क में /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
से निष्पादित)
जब डिवाइस एंड्रॉइड में बूट होता है, तो 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
पर इंस्टॉल हो जाते हैं, जो फिर vendor_ramdisk
के तहत /system/bin
पर इंस्टॉल हो जाते हैं।
पहले चरण के कंसोल (उदाहरण के लिए, एडीबीडी) के लिए आवश्यक मॉड्यूल जोड़ने के लिए, एओएसपी पर प्रासंगिक पैच अपलोड करके इन मॉड्यूल के vendor_ramdisk
संस्करण को सक्षम करें, फिर निम्नलिखित का उपयोग करें,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
यह सुनिश्चित करता है कि निर्दिष्ट मॉड्यूल $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
पर इंस्टॉल हो जाएं। यदि vendor_boot
रैमडिस्क को रिकवरी मोड में लोड किया गया है, तो मॉड्यूल recovery
में भी उपलब्ध है। यदि vendor_boot
रैमडिस्क पुनर्प्राप्ति मोड में लोड नहीं किया गया है, तो डिवाइस वैकल्पिक रूप से adbd.recovery
भी इंस्टॉल कर सकता है।
मेटाडेटा चेकसम
प्रथम चरण माउंट के दौरान मेटाडेटा चेकसम का समर्थन करने के लिए, जो डिवाइस GKI का समर्थन नहीं करते हैं वे निम्नलिखित मॉड्यूल के रैमडिस्क संस्करण को स्थापित करते हैं। GKI के लिए समर्थन जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
उदाहरण के लिए, इस परिवर्तन सूची को देखें।
आभासी ए/बी संपीड़न
वर्चुअल ए/बी कम्प्रेशन का समर्थन करने के लिए, snapuserd
vendor_ramdisk
पर स्थापित किया जाना चाहिए। डिवाइस को virtual_ab_ota/compression.mk
से इनहेरिट करना चाहिए, जो snapuserd
का vendor_ramdisk
वैरिएंट इंस्टॉल करता है।
बूट प्रक्रिया में परिवर्तन
एंड्रॉइड में बूट करते समय, बूट प्रक्रिया नहीं बदलती है। vendor_boot
+ जेनेरिक रैमडिस्क मौजूदा बूट प्रक्रिया के समान है, सिवाय इसके कि fstab
vendor_boot
से लोड होता है। क्योंकि system/bin/recovery
मौजूद नहीं है, first_stage_init
इसे सामान्य बूट के रूप में संभालता है।
पुनर्प्राप्ति मोड में बूट करने पर, बूट प्रक्रिया बदल जाती है। रिकवरी + vendor_boot
+ जेनेरिक रैमडिस्क मौजूदा रिकवरी प्रक्रिया के समान है, लेकिन कर्नेल को recovery
इमेज के बजाय boot
इमेज से लोड किया जाता है। पुनर्प्राप्ति मोड के लिए बूट प्रक्रिया इस प्रकार है।
बूटलोडर प्रारंभ होता है, फिर निम्न कार्य करता है:
- रिकवरी +
vendor_boot
+ जेनेरिक रैमडिस्क को/
पर पुश करता है। (यदि OEM पुनर्प्राप्ति रैमडिस्क में कर्नेल मॉड्यूल कोBOARD_RECOVERY_KERNEL_MODULES
में जोड़कर डुप्लिकेट करता है), तोvendor_boot
वैकल्पिक है।) - कर्नेल को
boot
पार्टीशन से चलाता है.
- रिकवरी +
कर्नेल रैमडिस्क को माउंट करता है
/
फिर जेनेरिक रैमडिस्क से/init
निष्पादित करता है।प्रथम चरण init प्रारंभ होता है, फिर निम्न कार्य करता है:
-
IsRecoveryMode() == true
औरForceNormalBoot() == false
सेट करता है। -
/lib/modules
से विक्रेता कर्नेल मॉड्यूल लोड करता है। -
DoFirstStageMount()
को कॉल करता है लेकिनIsRecoveryMode() == true
होने के कारण माउंटिंग रुक जाती है। (डिवाइस रैमडिस्क को मुक्त नहीं करता है (क्योंकि/
अभी भी वही है) लेकिनSetInitAvbVersionInRecovery()
कॉल करता है।) -
recovery
रैमडिस्क से/system/bin/init
दूसरा चरण init प्रारंभ करता है।
-
e2fsck उपलब्ध कराया जा रहा है
डिवाइस मेकफ़ाइल्स इनहेरिट कर सकते हैं:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
यदि डिवाइस वर्चुअल ए/बी का समर्थन करता है लेकिन संपीड़न का नहीं।virtual_ab_ota/compression.mk
यदि डिवाइस वर्चुअल ए/बी कंप्रेशन का समर्थन करता है।
उत्पाद मेकफ़ाइलें $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
इंस्टॉल करती हैं। रनटाइम पर, पहला चरण init
/system/bin/e2fsck
निष्पादित करता है।
विकल्प 2बी: समर्पित और गैर-ए/बी पुनर्प्राप्ति विभाजन
गैर-ए/बी recovery
विभाजन वाले उपकरणों के लिए इस विकल्प का उपयोग करें; अर्थात्, डिवाइस में स्लॉट प्रत्यय के बिना recovery
नाम का एक विभाजन है। ऐसे उपकरणों में शामिल हैं:
- गैर-ए/बी डिवाइस;
- ए/बी और वर्चुअल ए/बी डिवाइस, जिनमें से पुनर्प्राप्ति विभाजन अद्यतन करने योग्य नहीं है। (यह असामान्य है।)
vendor_boot
रैमडिस्क में रैमडिस्क और वेंडर कर्नेल मॉड्यूल के विक्रेता बिट्स शामिल हैं, जिनमें निम्नलिखित शामिल हैं:
- डिवाइस-विशिष्ट
fstab
फ़ाइलें -
lib/modules
(विक्रेता कर्नेल मॉड्यूल शामिल हैं)
recovery
छवि स्वयं-निहित होनी चाहिए. इसमें पुनर्प्राप्ति मोड को बूट करने के लिए सभी आवश्यक संसाधन शामिल होने चाहिए, जिनमें शामिल हैं:
- कर्नेल छवि
- डीटीबीओ छवि
-
lib/modules
में कर्नेल मॉड्यूल - सिम्लिंक
/init -> /system/bin/init
के रूप में प्रथम-चरण init - द्वितीय चरण init बाइनरी
/system/bin/init
- डिवाइस-विशिष्ट
fstab
फ़ाइलें -
recovery
बाइनरी आदि सहित अन्य सभी पुनर्प्राप्ति संसाधन। - वगैरह।
ऐसे उपकरणों पर, उत्पाद कॉन्फ़िगरेशन generic_ramdisk.mk
से प्राप्त होता है ।
बोर्ड मान सेट करना
गैर-ए/बी उपकरणों के लिए निम्नलिखित मान सेट करें:
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
अवश्य होना चाहिए। जब डिवाइस पुनर्प्राप्ति मोड में बूट होता है, तो पहले चरण और दूसरे चरण init दोनों का समर्थन करने के लिए /system/bin/init
बाइनरी की आवश्यकता होती है।
जब डिवाइस recovery
में बूट होता है, तो recovery
रैमडिस्क की सामग्री इस प्रकार होती है:
-
/init -> /system/bin/init
(recovery
रैमडिस्क से) -
/system/bin/init
(recovery
रैमडिस्क से,init_second_stage.recovery
से निर्मित, और/init
से निष्पादित)
जब डिवाइस एंड्रॉइड में बूट होता है, तो 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
पर इंस्टॉल हो जाते हैं, जो फिर vendor_ramdisk
के तहत /system/bin
पर इंस्टॉल हो जाते हैं।
पहले चरण के कंसोल (उदाहरण के लिए, एडीबीडी) के लिए आवश्यक मॉड्यूल जोड़ने के लिए, एओएसपी पर प्रासंगिक पैच अपलोड करके इन मॉड्यूल के vendor_ramdisk
संस्करण को सक्षम करें, फिर निम्नलिखित का उपयोग करें,
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 का समर्थन नहीं करते हैं वे निम्नलिखित मॉड्यूल के रैमडिस्क संस्करण को स्थापित करते हैं। GKI के लिए समर्थन जोड़ने के लिए, मॉड्यूल को $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
पर ले जाएं:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
पुनर्प्राप्ति में प्रथम चरण माउंट के दौरान मेटाडेटा चेकसम का समर्थन करने के लिए, इन मॉड्यूल के पुनर्प्राप्ति संस्करण को सक्षम करें और उन्हें भी इंस्टॉल करें।
बूट प्रक्रिया में परिवर्तन
एंड्रॉइड में बूट करते समय, बूट प्रक्रिया नहीं बदलती है। 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()
कॉल करता है।) -
recovery
रैमडिस्क से/system/bin/init
दूसरा चरण 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
छवि टाइमस्टैम्प गुणों को सेट करने के लिए इस फ़ाइल को पढ़ सके।