फास्टबूट को यूजरस्पेस में ले जाना

एंड्रॉइड 10 और उच्चतर फास्टबूट कार्यान्वयन को बूटलोडर से यूजरस्पेस में स्थानांतरित करके आकार बदलने योग्य विभाजन का समर्थन करता है। यह स्थानांतरण फ्लैशिंग कोड को हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) द्वारा कार्यान्वित फास्टबूट के केवल विक्रेता-विशिष्ट भागों के साथ एक रखरखाव योग्य और परीक्षण योग्य सामान्य स्थान पर ले जाने में सक्षम बनाता है। इसके अलावा, एंड्रॉइड 12 और उच्चतर एक अतिरिक्त फास्टबूट कमांड के माध्यम से फ्लैशिंग रैमडिस्क का समर्थन करता है।

फास्टबूट और रिकवरी को एकीकृत करना

क्योंकि यूजरस्पेस फास्टबूट और रिकवरी समान हैं, आप उन्हें एक विभाजन या बाइनरी में मर्ज कर सकते हैं। यह कम जगह का उपयोग करने, समग्र रूप से कम विभाजन होने, और फास्टबूट और रिकवरी अपने कर्नेल और लाइब्रेरीज़ को साझा करने जैसे लाभ प्रदान करता है।

fastbootd समर्थन करने के लिए, बूटलोडर को boot-fastboot का एक नया बूट कंट्रोल ब्लॉक (BCB) कमांड लागू करना होगा। fastbootd मोड में प्रवेश करने के लिए, बूटलोडर बीसीबी संदेश के कमांड फ़ील्ड में boot-fastboot लिखता है और बीसीबी के recovery फ़ील्ड को अपरिवर्तित छोड़ देता है (किसी भी बाधित पुनर्प्राप्ति कार्यों को पुनरारंभ करने में सक्षम करने के लिए)। status , stage और reserved फ़ील्ड भी अपरिवर्तित रहते हैं। बीसीबी कमांड फ़ील्ड में boot-fastboot देखने पर बूटलोडर पुनर्प्राप्ति छवि को लोड और बूट करता है। पुनर्प्राप्ति फिर बीसीबी संदेश को पार्स करती है और fastbootd मोड पर स्विच करती है।

एडीबी आदेश

यह अनुभाग fastbootd एकीकृत करने के लिए adb कमांड का वर्णन करता है। कमांड के अलग-अलग परिणाम होते हैं, यह इस पर निर्भर करता है कि इसे सिस्टम द्वारा निष्पादित किया गया है या पुनर्प्राप्ति द्वारा।

आज्ञा विवरण
reboot fastboot
  • fastbootd (सिस्टम) में रीबूट होता है।
  • रिबूट (पुनर्प्राप्ति) के बिना सीधे fastbootd में प्रवेश करता है।

फास्टबूट कमांड

यह अनुभाग fastbootd एकीकृत करने के लिए fastboot कमांड का वर्णन करता है, जिसमें तार्किक विभाजन को चमकाने और प्रबंधित करने के लिए नए कमांड शामिल हैं। कुछ कमांड के परिणाम अलग-अलग होते हैं, यह इस पर निर्भर करता है कि उन्हें बूटलोडर द्वारा निष्पादित किया गया है या fastbootd द्वारा।

आज्ञा विवरण
reboot recovery
  • पुनर्प्राप्ति (बूटलोडर) में रीबूट होता है।
  • रीबूट ( fastbootd ) के बिना सीधे पुनर्प्राप्ति में प्रवेश करता है।
reboot fastboot fastbootd में रीबूट होता है।
getvar is-userspace
  • yes लौटाता है ( fastbootd )।
  • रिटर्न no (बूटलोडर)।
getvar is-logical: <partition> यदि दिया गया विभाजन एक तार्किक विभाजन है तो yes लौटाता है, अन्यथा no । तार्किक विभाजन नीचे सूचीबद्ध सभी आदेशों का समर्थन करता है।
getvar super-partition-name सुपर पार्टीशन का नाम लौटाता है। यदि सुपर विभाजन एक ए/बी विभाजन है (यह आमतौर पर नहीं है) तो नाम में वर्तमान स्लॉट प्रत्यय शामिल है।
create-logical-partition <partition> <size> दिए गए नाम और आकार के साथ एक तार्किक विभाजन बनाता है। नाम पहले से ही तार्किक विभाजन के रूप में मौजूद नहीं होना चाहिए।
delete-logical-partition <partition> दिए गए तार्किक विभाजन को हटा देता है (विभाजन को प्रभावी ढंग से मिटा देता है)।
resize-logical-partition <partition> <size> तार्किक विभाजन की सामग्री को बदले बिना उसे नए आकार में आकार देता है। यदि आकार बदलने के लिए पर्याप्त स्थान उपलब्ध नहीं है तो विफल हो जाता है।
update-super <partition> परिवर्तनों को सुपर पार्टीशन मेटाडेटा में मर्ज करता है। यदि मर्ज संभव नहीं है (उदाहरण के लिए, डिवाइस पर प्रारूप एक असमर्थित संस्करण है), तो यह आदेश विफल हो जाता है। एक वैकल्पिक wipe पैरामीटर मर्ज करने के बजाय डिवाइस के मेटाडेटा को अधिलेखित कर देता है।
flash <partition> [ <filename> ] फ़्लैश पार्टीशन में एक फ़ाइल लिखता है। डिवाइस अनलॉक स्थिति में होना चाहिए.
erase <partition> किसी विभाजन को मिटा देता है (सुरक्षित रूप से मिटाने की आवश्यकता नहीं है)। डिवाइस अनलॉक स्थिति में होना चाहिए.
getvar <variable> | all बूटलोडर वैरिएबल या सभी वैरिएबल प्रदर्शित करता है। यदि वेरिएबल मौजूद नहीं है, तो एक त्रुटि देता है।
set_active <slot>

दिए गए ए/बी बूटिंग स्लॉट को active के रूप में सेट करता है। अगले बूट प्रयास पर, सिस्टम निर्दिष्ट स्लॉट से बूट होता है।

ए/बी समर्थन के लिए, स्लॉट विभाजन के डुप्लिकेट सेट हैं जिन्हें स्वतंत्र रूप से बूट किया जा सकता है। स्लॉट्स को a , b , इत्यादि नाम दिया गया है, और विभाजन नाम में _a , _b , इत्यादि प्रत्यय जोड़कर विभेदित किया गया है।

reboot डिवाइस को सामान्य रूप से रीबूट करता है।
reboot-bootloader (या reboot bootloader ) डिवाइस को बूटलोडर में रीबूट करता है।
fastboot fetch vendor_boot <out.img>

फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 12 और उच्चतर में उपयोग करें।

संपूर्ण विभाजन आकार और खंड आकार प्राप्त होता है। प्रत्येक टुकड़े के लिए डेटा प्राप्त करता है, फिर डेटा को <out.img> पर एक साथ जोड़ता है

विवरण के लिए, fastboot fetch vendor_boot <out.img> देखें।

fastboot flash vendor_boot:default <vendor-ramdisk.img>

फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 12 और उच्चतर में उपयोग करें।

यह फ़्लैश कमांड का एक विशेष प्रकार है. यह एक fetch vendor_boot छवि फ़ंक्शन निष्पादित करता है, जैसे कि fastboot fetch कॉल किया गया था। यह जो नई vendor_boot छवि चमकाती है, वह इस पर निर्भर करती है कि बूट हेडर संस्करण संस्करण 3 है या संस्करण 4।

विवरण के लिए, fastboot flash vendor_boot:default <vendor-ramdisk.img> देखें।

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 12 और उच्चतर में उपयोग करें।

vendor_boot छवि प्राप्त करता है। यदि विक्रेता बूट हेडर संस्करण 3 है तो एक त्रुटि देता है। यदि यह संस्करण 4 है, तो यह सही विक्रेता रैमडिस्क खंड (यदि उपलब्ध हो) ढूंढता है। यह उसे दी गई छवि से बदल देता है, आकार और ऑफसेट की पुनर्गणना करता है, और नई vendor_boot image फ्लैश करता है।

विवरण के लिए, fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

फास्टबूट और बूटलोडर

बूटलोडर bootloader , radio और boot/recovery विभाजन को फ्लैश करता है, जिसके बाद डिवाइस फास्टबूट (यूजरस्पेस) में बूट होता है और अन्य सभी विभाजन को फ्लैश करता है। बूटलोडर को निम्नलिखित आदेशों का समर्थन करना चाहिए।

आज्ञा विवरण
download फ्लैश करने के लिए छवि को डाउनलोड करता है।
flash recovery <image> / flash boot <image> / flash bootloader <image> / recovery/boot विभाजन और बूटलोडर को फ़्लैश करता है।
reboot डिवाइस को रीबूट करता है।
reboot fastboot फास्टबूट करने के लिए रिबूट।
reboot recovery पुनर्प्राप्ति के लिए रिबूट।
getvar एक बूटलोडर वेरिएबल प्राप्त करता है जो पुनर्प्राप्ति/बूट छवि को फ्लैश करने के लिए आवश्यक है (उदाहरण के लिए, current-slot और max-download-size )।
oem <command> OEM द्वारा परिभाषित कमांड।

गतिशील विभाजन

बूटलोडर को गतिशील विभाजनों को चमकाने या मिटाने की अनुमति नहीं देनी चाहिए और यदि इन परिचालनों का प्रयास किया जाता है तो एक त्रुटि लौटानी चाहिए । रेट्रोफिटेड डायनेमिक पार्टीशन डिवाइस के लिए, फास्टबूट टूल (और बूटलोडर) बूटलोडर मोड में डायनेमिक पार्टीशन को सीधे फ्लैश करने के लिए फोर्स मोड का समर्थन करता है। उदाहरण के लिए, यदि system रेट्रोफ़िटेड डिवाइस पर एक गतिशील विभाजन है, तो fastboot --force flash system कमांड का उपयोग बूटलोडर ( fastbootd के बजाय) को विभाजन को फ्लैश करने में सक्षम बनाता है।

ऑफ-मोड चार्जिंग

यदि कोई डिवाइस ऑफ-मोड चार्जिंग का समर्थन करता है या अन्यथा पावर लागू होने पर एक विशेष मोड में ऑटोबूट होता है, तो fastboot oem off-mode-charge 0 कमांड के कार्यान्वयन को इन विशेष मोड को बायपास करना होगा, ताकि डिवाइस बूट हो सके जैसे कि उपयोगकर्ता ने दबाया था पावर बटन.

फास्टबूट ओईएम एचएएल

बूटलोडर फास्टबूट को पूरी तरह से बदलने के लिए, फास्टबूट को सभी मौजूदा फास्टबूट कमांड को संभालना होगा। इनमें से कई कमांड ओईएम से हैं और दस्तावेजित हैं लेकिन कस्टम कार्यान्वयन की आवश्यकता है। कई OEM-विशिष्ट कमांड दस्तावेज़ीकृत नहीं हैं । ऐसे कमांड को संभालने के लिए, फास्टबूट एचएएल आवश्यक OEM कमांड निर्दिष्ट करता है। ओईएम अपने स्वयं के आदेश भी लागू कर सकते हैं।

फास्टबूट एचएएल की परिभाषा इस प्रकार है:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

फास्टबूट सक्षम करना

किसी डिवाइस पर fastbootd सक्षम करने के लिए:

  1. device.mk में PRODUCT_PACKAGES में fastbootd जोड़ें: PRODUCT_PACKAGES += fastbootd

  2. सुनिश्चित करें कि फास्टबूट एचएएल, बूट कंट्रोल एचएएल और हेल्थ एचएएल को पुनर्प्राप्ति छवि के हिस्से के रूप में पैक किया गया है।

  3. fastbootd द्वारा आवश्यक कोई भी डिवाइस-विशिष्ट SEPolicy अनुमतियाँ जोड़ें। उदाहरण के लिए, fastbootd उस विभाजन को फ्लैश करने के लिए डिवाइस-विशिष्ट विभाजन तक लेखन पहुंच की आवश्यकता होती है। इसके अलावा, फास्टबूट एचएएल कार्यान्वयन के लिए डिवाइस-विशिष्ट अनुमतियों की भी आवश्यकता हो सकती है।

यूजरस्पेस फास्टबूट को मान्य करने के लिए, वेंडर टेस्ट सूट (वीटीएस) चलाएं।

चमकती विक्रेता रैमडिस्क

एंड्रॉइड 12 और उच्चतर एक अतिरिक्त फास्टबूट कमांड के साथ फ्लैशिंग रैमडिस्क के लिए समर्थन प्रदान करता है जो एक डिवाइस से पूर्ण vendor_boot छवि खींचता है। कमांड होस्ट-साइड फास्टबूट टूल को वेंडर बूट हेडर को पढ़ने, रीइमेज करने और नई इमेज को फ्लैश करने के लिए प्रेरित करता है।

पूर्ण vendor_boot छवि को खींचने के लिए, कमांड fetch:vendor_boot फास्टबूट प्रोटोकॉल और एंड्रॉइड 12 में प्रोटोकॉल के फास्टबूट कार्यान्वयन दोनों में जोड़ा गया था। ध्यान दें कि फास्टबूट इसे लागू करता है , लेकिन बूटलोडर स्वयं नहीं कर सकता है। ओईएम अपने प्रोटोकॉल के बूटलोडर कार्यान्वयन में fetch:vendor_boot कमांड जोड़ सकते हैं। हालाँकि, यदि कमांड बूटलोडर मोड में पहचाना नहीं गया है, तो बूटलोडर मोड में व्यक्तिगत विक्रेता रैमडिस्क को फ्लैश करना विक्रेता-समर्थित विकल्प नहीं है।

बूटलोडर बदलता है

कमांड getvar:max-fetch-size और fetch:name fastbootd में लागू किए गए हैं। बूटलोडर में फ्लैशिंग वेंडर रैमडिस्क का समर्थन करने के लिए, आपको इन दो कमांड को लागू करना होगा।

फास्टबूट परिवर्तन

getvar:max-fetch-size max-download-size के समान है। यह अधिकतम आकार निर्दिष्ट करता है जिसे डिवाइस एक डेटा प्रतिक्रिया में भेज सकता है। ड्राइवर को इस मान से बड़ा आकार नहीं लाना चाहिए।

fetch:name[:offset[:size]] डिवाइस पर जांच की एक श्रृंखला निष्पादित करता है। यदि निम्नलिखित सभी सत्य हैं, तो fetch:name[:offset[:size]] कमांड डेटा लौटाता है:

  • डिवाइस डिबग करने योग्य बिल्ड चला रहा है।
  • डिवाइस अनलॉक है (बूट स्थिति नारंगी है)।
  • प्राप्त विभाजन का नाम vendor_boot है।
  • size मान 0 < size <= max-fetch-size के भीतर आता है।

जब इन्हें सत्यापित किया जाता है, fetch:name[:offset[:size]] विभाजन आकार और ऑफसेट लौटाता है। निम्नलिखित पर ध्यान दें:

  • fetch:name fetch:name:0 के बराबर है, जो fetch:name:0:partition_size के बराबर है।
  • fetch:name:offset fetch:name:offset:(partition_size - offset) के बराबर है

इसलिए fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

जब offset या partition_size (या दोनों) अनिर्दिष्ट होते हैं, तो डिफ़ॉल्ट मानों का उपयोग किया जाता है, जो offset के लिए 0 है, और size के लिए partition_size - offset का परिकलित मान है।

  • ऑफसेट निर्दिष्ट, आकार अनिर्दिष्ट: size = partition_size - offset
  • कोई भी निर्दिष्ट नहीं: दोनों के लिए उपयोग किए गए डिफ़ॉल्ट मान, size = partition_size - 0।

उदाहरण के लिए, fetch:foo संपूर्ण foo विभाजन को ऑफसेट 0 पर लाता है।

ड्राइवर बदलता है

ड्राइवर परिवर्तनों को लागू करने के लिए फास्टबूट टूल में कमांड जोड़े गए थे। प्रत्येक फास्टबूट कमांड की तालिका में अपनी पूरी परिभाषा से जुड़ा हुआ है।

  • fastboot fetch vendor_boot out.img

    • चंक आकार निर्धारित करने के लिए getvar max-fetch-size को कॉल करता है।
    • संपूर्ण विभाजन का आकार निर्धारित करने के लिए getvar partition-size:vendor_boot[_a] को कॉल करता है।
    • प्रत्येक टुकड़े के लिए fastboot fetch vendor_boot[_a]:offset:size । (खंड का आकार vendor_boot आकार से बड़ा है, इसलिए आम तौर पर केवल एक ही खंड होता है।)
    • डेटा को out.img पर एक साथ जोड़ता है।
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    यह फ़्लैश कमांड का एक विशेष प्रकार है. यह vendor_boot छवि को लाता है, जैसे कि fastboot fetch बुलाया गया था।

    • यदि विक्रेता बूट हेडर संस्करण 3 है, तो यह निम्न कार्य करता है:
      • विक्रेता रैमडिस्क को दी गई छवि से बदल देता है।
      • नई vendor_boot छवि चमकती है।
    • यदि विक्रेता बूट हेडर संस्करण 4 है, तो यह निम्न कार्य करता है:
      • संपूर्ण विक्रेता रैमडिस्क को दी गई छवि से बदल देता है ताकि दी गई छवि vendor_boot छवि में एकमात्र विक्रेता रैमडिस्क टुकड़ा बन जाए।
      • विक्रेता रैमडिस्क तालिका में आकार और ऑफसेट की पुनर्गणना करता है।
      • नई vendor_boot छवि चमकती है।
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image फ़ेच करता है, जैसे कि fastboot fetch कहा गया हो।

    • यदि विक्रेता बूट हेडर संस्करण 3 है, तो यह एक त्रुटि देता है।
    • यदि विक्रेता बूट हेडर संस्करण 4 है, तो यह निम्न कार्य करता है:

      • foo नाम के साथ विक्रेता रैमडिस्क खंड ढूँढता है। यदि नहीं मिला, या यदि एकाधिक मिलान हैं, तो एक त्रुटि मिलती है।
      • विक्रेता रैमडिस्क फ़्रैगमेंट को दी गई छवि से बदल देता है।
      • विक्रेता रैमडिस्क तालिका में प्रत्येक आकार और ऑफसेट की पुनर्गणना करता है।
      • नई vendor_boot छवि चमकती है।

mkbootimg

default नाम Android 12 और उच्चतर में विक्रेता रैमडिस्क फ़्रैगमेंट के नामकरण के लिए आरक्षित है। जबकि फास्टबूट flash vendor_boot:default शब्दार्थ वही रहता है, आपको अपने रैमडिस्क टुकड़ों को default के रूप में नाम नहीं देना चाहिए

SELinux बदलता है

फ़्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए fastbootd.te में एक बदलाव किया गया था।