सामान्य बूट विभाजन

एंड्रॉइड 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 के साथ लॉन्च करें, कोई समर्पित पुनर्प्राप्ति नहीं

डिवाइस लॉन्च/अपग्रेड करें, GKI, कोई समर्पित पुनर्प्राप्ति नहीं

चित्र 1. जीकेआई के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले डिवाइस, कोई समर्पित पुनर्प्राप्ति नहीं

Android 13, समर्पित और A/B पुनर्प्राप्ति (समर्पित रैमडिस्क) के साथ लॉन्च करें

लॉन्च/अपग्रेड डिवाइस, जीकेआई, समर्पित और ए/बी रिकवरी

चित्र 2. जीकेआई, समर्पित और ए/बी रिकवरी के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले डिवाइस

यदि डिवाइस में recovery_a और recovery_b विभाजन हैं तो इस आंकड़े को देखें।

Android 13 के साथ लॉन्च, समर्पित और गैर-ए/बी पुनर्प्राप्ति (समर्पित रैमडिस्क)

लॉन्च/अपग्रेड डिवाइस, जीकेआई, समर्पित और गैर-ए/बी रिकवरी

चित्र 3. जीकेआई, समर्पित और गैर-ए/बी पुनर्प्राप्ति के साथ एंड्रॉइड 13 पर लॉन्च या अपग्रेड करने वाले उपकरण

यदि डिवाइस में स्लॉट प्रत्यय के बिना recovery नामक विभाजन है तो इस आंकड़े को देखें।

Android 12 लॉन्च करें या अपग्रेड करें, कोई समर्पित पुनर्प्राप्ति नहीं

डिवाइस लॉन्च/अपग्रेड करें, GKI, कोई समर्पित पुनर्प्राप्ति नहीं

चित्र 4. जीकेआई के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले डिवाइस, कोई समर्पित पुनर्प्राप्ति नहीं

एंड्रॉइड 12 में लॉन्च या अपग्रेड करें, समर्पित और ए/बी रिकवरी (समर्पित रैमडिस्क)

लॉन्च/अपग्रेड डिवाइस, जीकेआई, समर्पित और ए/बी रिकवरी

चित्र 5. जीकेआई, समर्पित और ए/बी रिकवरी के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले डिवाइस

यदि डिवाइस में recovery_a और recovery_b विभाजन हैं तो इस आंकड़े को देखें।

एंड्रॉइड 12 में लॉन्च या अपग्रेड करें, समर्पित और गैर-ए/बी रिकवरी (समर्पित रैमडिस्क)

लॉन्च/अपग्रेड डिवाइस, जीकेआई, समर्पित और गैर-ए/बी रिकवरी

चित्र 6. जीकेआई, समर्पित और गैर-ए/बी पुनर्प्राप्ति के साथ एंड्रॉइड 12 पर लॉन्च या अपग्रेड करने वाले उपकरण

यदि डिवाइस में स्लॉट प्रत्यय के बिना recovery नामक विभाजन है तो इस आंकड़े को देखें।

एंड्रॉइड 12 में अपग्रेड करें, रिकवरी-एज़-बूट (रिकवरी-एज़-रैमडिस्क)

डिवाइस लॉन्च/अपग्रेड करें, कोई GKI नहीं, रिकवरी-एज़-बूट

चित्र 7. Android 12 में अपग्रेड होने वाले उपकरण, कोई GKI नहीं, रिकवरी-एज़-बूट

Android 12 में अपग्रेड करें, समर्पित पुनर्प्राप्ति (समर्पित रैमडिस्क)

डिवाइस लॉन्च/अपग्रेड करें, कोई GKI नहीं, समर्पित पुनर्प्राप्ति

चित्र 8. Android 12 में अपग्रेड होने वाले उपकरण, कोई GKI नहीं, समर्पित पुनर्प्राप्ति

छवियाँ सामग्री बूट करें

एंड्रॉइड बूट छवियों में निम्नलिखित शामिल हैं।

  • Android 13 के साथ लॉन्च होने वाले उपकरणों के लिए init_boot छवि जोड़ी गई

    • हेडर संस्करण V4
    • सामान्य रैमडिस्क छवि
  • सामान्य boot छवि

    • हेडर संस्करण V3 या V4
      • GKI Boot.img प्रमाणन के लिए एक boot_signature (केवल v4)। प्रमाणित GKI boot.img सत्यापित बूट के लिए हस्ताक्षरित नहीं है। ओईएम को अभी भी डिवाइस-विशिष्ट AVB कुंजी के साथ प्रीबिल्ट boot.img पर हस्ताक्षर करना होगा।
      • सामान्य cmdline ( GENERIC_KERNEL_CMDLINE )
      • जीकेआई कर्नेल
    • सामान्य रैमडिस्क छवि
      • केवल Android 12 और उससे पहले की boot छवियों में शामिल है
  • 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 बाइनरी द्वारा ढका हुआ है।

सामान्य रैमडिस्क छवि सामग्री

जेनेरिक रैमडिस्क में निम्नलिखित घटक होते हैं।

  • 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 को true पर सेट करें, आर्किटेक्चर चित्र 3 में दिखाया गया है।

      • BOARD_USES_RECOVERY_AS_BOOT को खाली पर सेट करें, आर्किटेक्चर चित्र 4 में दिखाया गया है।

    • 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 इमेज से लोड किया जाता है। पुनर्प्राप्ति मोड के लिए बूट प्रक्रिया इस प्रकार है।

  1. बूटलोडर प्रारंभ होता है, फिर निम्न कार्य करता है:

    1. रिकवरी + vendor_boot + जेनेरिक रैमडिस्क को / पर पुश करता है। (यदि OEM पुनर्प्राप्ति रैमडिस्क में कर्नेल मॉड्यूल को BOARD_RECOVERY_KERNEL_MODULES में जोड़कर डुप्लिकेट करता है), तो vendor_boot वैकल्पिक है।)
    2. कर्नेल को boot पार्टीशन से चलाता है.
  2. कर्नेल रैमडिस्क को माउंट करता है / फिर जेनेरिक रैमडिस्क से /init निष्पादित करता है।

  3. प्रथम चरण init प्रारंभ होता है, फिर निम्न कार्य करता है:

    1. IsRecoveryMode() == true और ForceNormalBoot() == false सेट करता है।
    2. /lib/modules से विक्रेता कर्नेल मॉड्यूल लोड करता है।
    3. DoFirstStageMount() को कॉल करता है लेकिन IsRecoveryMode() == true होने के कारण माउंटिंग रुक जाती है। (डिवाइस रैमडिस्क को मुक्त नहीं करता है (क्योंकि / अभी भी वही है) लेकिन SetInitAvbVersionInRecovery() कॉल करता है।)
    4. 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 छवि से लोड किया गया है। पुनर्प्राप्ति मोड के लिए बूट प्रक्रिया इस प्रकार है।

  1. बूटलोडर प्रारंभ होता है, फिर निम्न कार्य करता है:

    1. पुनर्प्राप्ति रैमडिस्क को / पर धकेलता है।
    2. recovery विभाजन से कर्नेल चलाता है.
  2. कर्नेल रैमडिस्क को / पर माउंट करता है और फिर /init निष्पादित करता है, जो recovery रैमडिस्क से /system/bin/init एक सिम्लिंक है।

  3. प्रथम चरण init प्रारंभ होता है, फिर निम्न कार्य करता है:

    1. IsRecoveryMode() == true और ForceNormalBoot() == false सेट करता है।
    2. /lib/modules से विक्रेता कर्नेल मॉड्यूल लोड करता है।
    3. DoFirstStageMount() को कॉल करता है लेकिन IsRecoveryMode() == true होने के कारण माउंटिंग रुक जाती है। (डिवाइस रैमडिस्क को मुक्त नहीं करता है (क्योंकि / अभी भी वही है) लेकिन SetInitAvbVersionInRecovery() कॉल करता है।)
    4. 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 छवि टाइमस्टैम्प गुणों को सेट करने के लिए इस फ़ाइल को पढ़ सके।