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

Android 10 और उसके बाद के वर्शन में, फ़ास्टबूट लागू करने की प्रोसेस को बूटलोडर से यूज़रस्पेस पर ले जाया जा सकता है. इससे पार्टिशन का साइज़ बदला जा सकता है. इस रीलोकेशन से फ़्लैशिंग कोड को मैनेज की जा सकने वाली और जांची जा सकने वाली कॉमन लोकेशन में ले जाया जा सकता है. इसमें हार्डवेयर ऐब्स्ट्रक्शन लेयर (एचएएल) की मदद से, सिर्फ़ फ़ास्टबूट के वेंडर के खास पार्ट लागू किए जाते हैं. इसके अलावा, Android 12 और उसके बाद के वर्शन में फ़ास्टबूट कमांड की मदद से रैम डिस्क फ़्लैश होती हैं.

फ़ास्टबूट और रिकवरी को जोड़ें

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

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

ADB आदेश

इस सेक्शन में, fastbootd को इंटिग्रेट करने के लिए, adb कमांड के बारे में बताया गया है. कमांड के नतीजे अलग-अलग होते हैं. यह इस बात पर निर्भर करता है कि कमांड को सिस्टम ने एक्ज़ीक्यूट किया है या रिकवरी से.

निर्देश ब्यौरा
reboot fastboot
  • fastbootd (सिस्टम) में फिर से चालू होता है.
  • फिर से चालू किए बिना (रिकवरी) सीधे fastbootd में जाता है.

फ़ास्टबूट निर्देश

इस सेक्शन में, fastbootd को इंटिग्रेट करने के फ़ास्टबूट निर्देशों के बारे में बताया गया है. इनमें, फ़्लैश करने और लॉजिकल पार्टिशन को मैनेज करने के नए निर्देश भी शामिल हैं. कुछ कमांड के नतीजे अलग-अलग होते हैं. यह इस बात पर निर्भर करता है कि उन्हें बूटलोडर ने एक्ज़ीक्यूट किया है या fastbootd ने.

निर्देश ब्यौरा
reboot recovery
  • रिकवरी में फिर से चालू करता है (बूटलोडर).
  • फिर से चालू किए बिना सीधे तौर पर रिकवरी की प्रक्रिया शुरू करता है (fastbootd).
reboot fastboot fastbootd में फिर से चालू होगा.
getvar is-userspace
  • yes (fastbootd) लौटाता है.
  • no (बूटलोडर) दिखाता है.
getvar is-logical:<partition> अगर दिया गया विभाजन लॉजिकल विभाजन है, तो yes देता है, नहीं तो no देता है. लॉजिकल पार्टीशन, नीचे दिए गए सभी कमांड के साथ काम करते हैं.
getvar super-partition-name सुपर पार्टीशन का नाम दिखाता है. अगर सुपर पार्टिशन एक A/B पार्टिशन है (आम तौर पर नहीं होता है), तो नाम में मौजूदा स्लॉट सफ़िक्स शामिल होता है.
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>

दिए गए A/B बूटिंग स्लॉट को active के तौर पर सेट करता है. अगली बार बूट करने पर, सिस्टम बताए गए स्लॉट से चालू हो जाता है.

A/B की सुविधा के लिए, स्लॉट, पार्टिशन के डुप्लीकेट सेट होते हैं जिन्हें अलग से चालू किया जा सकता है. स्लॉट को a, b वगैरह के नाम दिए गए हैं. साथ ही, इन्हें पार्टिशन के नाम में _a, _b वगैरह सफ़िक्स जोड़कर इन्हें अलग-अलग किया जा सकता है.

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

फ़्लैश करने वाले वेंडर रैमडिस्क की सुविधा के लिए, Android 12 और इसके बाद के वर्शन में इस्तेमाल करें.

इसमें, सेगमेंट के पूरे साइज़ और सेगमेंट का साइज़ मिलता है. हर हिस्से का डेटा शामिल करता है, फिर डेटा को <out.img> से जोड़ देता है

ज़्यादा जानकारी के लिए, fastboot fetch vendor_boot <out.img> देखें.

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

फ़्लैश करने वाले वेंडर रैमडिस्क के साथ काम करने के लिए, Android 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> फ़्लैश करने वाले वेंडर रैमडिस्क के साथ काम करने के लिए, Android 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 से हैं और इनका रिकॉर्ड रखा गया है. हालांकि, इन्हें लागू करने की ज़रूरत है. OEM से जुड़े कई निर्देशों का दस्तावेज़ नहीं है. ऐसे निर्देशों को हैंडल करने के लिए, फ़ास्टबूट HAL ज़रूरी 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 को डिवाइस के किसी खास हिस्से में लिखने के ऐक्सेस की ज़रूरत होती है, ताकि उस हिस्से को फ़्लैश किया जा सके. इसके अलावा, फ़ास्टबूट एचएएल को लागू करने के लिए डिवाइस से जुड़ी खास अनुमतियों की भी ज़रूरत पड़ सकती है.

यूज़रस्पेस फ़ास्टबूट की पुष्टि करने के लिए, विक्रेता टेस्ट सुइट (वीटीएस) चलाएं.

फ़्लैश वेंडर के लिए रैम डिस्क

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

vendor_boot की पूरी इमेज खींचने के लिए, फ़ास्टबूट प्रोटोकॉल और Android 12 में फ़ास्टबूट प्रोटोकॉल को लागू करने के तरीके में fetch:vendor_boot निर्देश जोड़ा गया था. ध्यान दें कि फ़ास्टबूट इसे लागू करता है, लेकिन हो सकता है कि बूटलोडर ने ऐसा न किया हो. OEM, प्रोटोकॉल को लागू करने के अपने बूटलोडर में 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 को कॉल किया गया हो.

    • अगर वेंडर बूट, हेडर version 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

Android 12 और इसके बाद के वर्शन में, वेंडर के रैम डिस्क फ़्रैगमेंट को नाम देने के लिए default नाम रिज़र्व रखा गया है. फ़ास्टबूट flash vendor_boot:default सिमेंटिक्स में कोई बदलाव नहीं होता है, लेकिन आपको अपने रैम डिस्क फ़्रैगमेंट का नाम default नहीं रखना चाहिए.

SELinux बदलाव

fastbootd.te में बदलाव किया गया, ताकि फ़्लैश होने वाले वेंडर रैम डिस्क को चालू किया जा सके.