Fastboot, बूटलोडर मॉड्यूल और मोड का नाम है. Android 10 और इसके बाद के वर्शन में, फ़ास्टबूट को बूटलोडर से यूज़रस्पेस में ले जाकर, पार्टिशन का साइज़ बदला जा सकता है. इस बदलाव की वजह से, फ़्लैश करने वाले कोड को ऐसी जगह पर ले जाया जा सकता है जहां उसे मैनेज किया जा सके और उसकी जांच की जा सके. साथ ही, इसमें फ़ास्टबूट के सिर्फ़ वेंडर-खास हिस्से शामिल होते हैं जिन्हें हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) लागू करता है. इसके अलावा, Android 12 और इसके बाद के वर्शन में, फ़ास्टबूट कमांड की मदद से रैमडिस्क फ़्लैश करने की सुविधा भी उपलब्ध है.
फ़ास्टबूट और रिकवरी को एक साथ इस्तेमाल करना
यूज़रस्पेस फ़ास्टबूट और रिकवरी एक जैसे होते हैं. इसलिए, इन्हें एक ही partition या बाइनरी में मर्ज किया जा सकता है. इससे कई फ़ायदे मिलते हैं. जैसे, कम जगह का इस्तेमाल करना, कम से कम पार्टिशन होना, और फ़ास्टबूट और रिकवरी के लिए एक ही कर्नेल और लाइब्रेरी का इस्तेमाल करना.
Fastbootd, यूज़रस्पेस डेमन और मोड का नाम है.
fastbootd
के साथ काम करने के लिए, बूटलोडर को boot-fastboot
का नया बूट कंट्रोल ब्लॉक (बीसीबी) कमांड लागू करना होगा. fastbootd
मोड में जाने के लिए, बूटलोडर, BCB मैसेज के कमांड फ़ील्ड में boot-fastboot
लिखता है और BCB के recovery
फ़ील्ड में कोई बदलाव नहीं करता. ऐसा इसलिए किया जाता है, ताकि बीच में रुके हुए रिकवरी टास्क को फिर से शुरू किया जा सके. status
, stage
, और reserved
फ़ील्ड में भी कोई बदलाव नहीं होता.
BCB कमांड फ़ील्ड में boot-fastboot
दिखने पर, बूटलोडर लोड होता है और रिकवरी इमेज में बूट होता है. इसके बाद, रिकवरी प्रोसेस, बीसीबी मैसेज को पार्स करती है और fastbootd
मोड पर स्विच हो जाती है.
ADB निर्देश
इस सेक्शन में, fastbootd
को इंटिग्रेट करने के लिए adb
कमांड के बारे में बताया गया है. कमांड के अलग-अलग नतीजे मिलते हैं. यह इस बात पर निर्भर करता है कि इसे सिस्टम या रिकवरी से चलाया गया है.
निर्देश | ब्यौरा |
---|---|
reboot fastboot |
|
फ़ास्टबूट मोड में दिए जाने वाले निर्देश
इस सेक्शन में, fastbootd
को इंटिग्रेट करने के लिए fastboot कमांड के बारे में बताया गया है. इसमें, फ़्लैश करने और लॉजिकल पार्टीशन को मैनेज करने के लिए नए कमांड भी शामिल हैं. कुछ कमांड के नतीजे अलग-अलग होते हैं. यह इस बात पर निर्भर करता है कि उन्हें बूटलोडर ने चलाया है या fastbootd
ने.
निर्देश | ब्यौरा |
---|---|
reboot recovery |
|
reboot fastboot |
fastbootd में फिर से चालू हो जाता है. |
getvar is-userspace |
|
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> |
लॉजिकल पार्टीशन के कॉन्टेंट में कोई बदलाव किए बिना, उसके साइज़ को नए साइज़ में बदलता है. अगर साइज़ बदलने के लिए ज़रूरत के मुताबिक जगह उपलब्ध नहीं है, तो यह काम नहीं होगा. |
flash <partition> [ <filename> ] |
फ़्लैश पार्टीशन में फ़ाइल लिखता है. डिवाइस अनलॉक होना चाहिए. |
erase <partition> |
किसी पार्टीशन को मिटाता है. हालांकि, इसे सुरक्षित तरीके से मिटाने की ज़रूरत नहीं है. डिवाइस अनलॉक होना चाहिए. |
getvar <variable> | all |
बूटलोडर वैरिएबल या सभी वैरिएबल दिखाता है. अगर वैरिएबल मौजूद नहीं है, तो गड़बड़ी का मैसेज दिखता है. |
set_active <slot> |
दिए गए A/B बूटिंग स्लॉट को A/B वर्शन की सुविधा के लिए, स्लॉट, पार्टीशन के डुप्लीकेट सेट होते हैं. इन्हें अलग से बूट किया जा सकता है. स्लॉट के नाम |
reboot |
डिवाइस को सामान्य तरीके से रीस्टार्ट करता है. |
reboot-bootloader (या reboot bootloader ) |
डिवाइस को बूटलोडर में रीबूट करता है. |
fastboot fetch vendor_boot <out.img> |
Android 12 और उसके बाद के वर्शन में इस्तेमाल करें, ताकि वेंडर के रैमडस्क को फ़्लैश करने की सुविधा काम कर सके.
इससे पूरे पार्टिशन का साइज़ और चंक का साइज़ पता चलता है. हर चंक का डेटा पाता है,
फिर डेटा को
ज़्यादा जानकारी के लिए, |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
वेंडर के रैमडिस्क को फ़्लैश करने के लिए, Android 12 और उसके बाद के वर्शन में इस्तेमाल करें. यह फ़्लैश कमांड का एक खास वैरिएंट है. यह
ज़्यादा जानकारी के लिए, |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Android 12 और उसके बाद के वर्शन में इस्तेमाल करें, ताकि
वेंडर के रैमडिस्क को फ़्लैश किया जा सके.
ज़्यादा जानकारी के लिए, |
फ़ास्टबूट और बूटलोडर
बूटलोडर, 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> |
ओईएम की ओर से तय किया गया निर्देश. |
डाइनैमिक पार्टीशन
बूटलोडर को डाइनैमिक पार्टीशन को फ़्लैश करने या मिटाने की अनुमति नहीं देनी चाहिए. साथ ही, अगर इन कार्रवाइयों की कोशिश की जाती है, तो उसे गड़बड़ी का मैसेज देना चाहिए. बाद में डाइनैमिक पार्टिशन जोड़े गए डिवाइसों के लिए, फ़ास्टबूट टूल (और बूटलोडर) में फ़ोर्स मोड की सुविधा होती है. इसकी मदद से, बूटलोडर मोड में डाइनैमिक पार्टिशन को सीधे फ़्लैश किया जा सकता है. उदाहरण के लिए, अगर system
, फिर से फ़िट किए गए डिवाइस पर डाइनैमिक पार्टीशन है, तो fastboot --force flash system
कमांड का इस्तेमाल करके, fastbootd
के बजाय बूटलोडर को पार्टीशन को फ़्लैश करने की अनुमति मिलती है.
ऑफ-मोड चार्जिंग
अगर कोई डिवाइस, बंद मोड में चार्ज करने की सुविधा देता है या पावर लागू होने पर, अपने-आप किसी खास मोड में बूट होता है, तो fastboot oem off-mode-charge 0
कमांड को लागू करने के लिए, इन खास मोड को बायपास करना ज़रूरी है. इससे डिवाइस, वैसे ही बूट होगा जैसे उपयोगकर्ता ने पावर बटन दबाया हो.
Fastboot OEM HAL
बूटलोडर fastboot को पूरी तरह से बदलने के लिए, fastboot को सभी मौजूदा fastboot निर्देशों को मैनेज करना होगा. इनमें से कई निर्देश, OEM के हैं और इनका दस्तावेज़ उपलब्ध है. हालांकि, इन्हें लागू करने के लिए, कस्टम तरीके अपनाने की ज़रूरत होती है. OEM के हिसाब से कई निर्देशों का दस्तावेज़ नहीं बनाया गया है. ऐसे निर्देशों को मैनेज करने के लिए, fastboot HAL ज़रूरी OEM निर्देशों की जानकारी देता है. OEM अपने निर्देश भी लागू कर सकते हैं.
fastboot HAL की परिभाषा इस तरह है:
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 चालू करना
किसी डिवाइस पर fastbootd
चालू करने के लिए:
device.mk
मेंPRODUCT_PACKAGES
मेंfastbootd
जोड़ें:PRODUCT_PACKAGES += fastbootd
.पक्का करें कि रिकवरी इमेज के हिस्से के तौर पर, fastboot HAL, boot control HAL, और health HAL को पैकेज किया गया हो.
fastbootd
के लिए ज़रूरी, डिवाइस के हिसाब से SEPolicy की अनुमतियां जोड़ें. उदाहरण के लिए,fastbootd
को किसी डिवाइस के खास पार्टीशन को फ़्लैश करने के लिए, उस पार्टीशन को लिखने का ऐक्सेस चाहिए. इसके अलावा, fastboot HAL को लागू करने के लिए, डिवाइस के हिसाब से अनुमतियों की भी ज़रूरत पड़ सकती है.
यूज़रस्पेस फ़ास्टबूट की पुष्टि करने के लिए, वेंडर टेस्ट सुइट (वीटीएस) चलाएं.
फ़्लैश वेंडर के रैमडिस्क
Android 12 और इसके बाद के वर्शन में, रैम डिस्क को फ़्लैश करने की सुविधा मिलती है. इसके लिए, एक फ़ास्टबूट कमांड जोड़ा गया है, जो किसी डिवाइस से पूरी vendor_boot
इमेज खींचता है. यह कमांड, होस्ट-साइड के fastboot टूल को वेंडर बूट हेडर पढ़ने, फिर से इमेज बनाने, और नई इमेज को फ़्लैश करने के लिए कहता है.
vendor_boot
इमेज को पूरी तरह से खींचने के लिए, Android 12 में fetch:vendor_boot
कमांड को, फ़ास्टबूट प्रोटोकॉल और प्रोटोकॉल के फ़ास्टबूटड लागू करने, दोनों में जोड़ा गया था. ध्यान दें कि fastbootd इस सुविधा को लागू करता है, लेकिन हो सकता है कि बूटलोडर ऐसा न करे. OEM, प्रोटोकॉल के अपने बूटलोडर को लागू करने के लिए, fetch:vendor_boot
कमांड जोड़ सकते हैं. हालांकि, अगर बूटलोडर मोड में कमांड काम नहीं करता है, तो बूटलोडर मोड में अलग-अलग वेंडर के रैमडिस्क फ़्लैश करने की सुविधा, वेंडर के लिए उपलब्ध नहीं है.
बूटलोडर में हुए बदलाव
getvar:max-fetch-size
और fetch:name
निर्देश, fastbootd
में लागू किए गए हैं. बूटलोडर में वेंडर के रैमडिस्क को फ़्लैश करने के लिए, आपको इन दो निर्देशों को लागू करना होगा.
Fastbootd में हुए बदलाव
getvar:max-fetch-size
, max-download-size
से मिलता-जुलता है. इससे यह पता चलता है कि डिवाइस, एक DATA रिस्पॉन्स में ज़्यादा से ज़्यादा कितना डेटा भेज सकता है. ड्राइवर को इस वैल्यू से ज़्यादा साइज़ फ़ेच नहीं करना चाहिए.
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
, ऑफ़सेट 0 पर पूरा foo
पार्टीशन फ़ेच करता है.
ड्राइवर में बदलाव
ड्राइवर में किए गए बदलावों को लागू करने के लिए, fastboot टूल में कमांड जोड़े गए हैं. हर निर्देश, Fastboot निर्देशों की टेबल में अपनी पूरी परिभाषा से लिंक होता है.
fastboot fetch vendor_boot out.img
- चंक का साइज़ तय करने के लिए,
getvar max-fetch-size
को कॉल करता है. - पूरे partition का साइज़ तय करने के लिए,
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
इमेज को फ़्लैश करता है.
- अगर वेंडर बूट हेडर version
4 है, तो यह ये काम करता है:
- यह वैंडर की पूरी रैमडिस्क को दी गई इमेज से बदल देता है, ताकि
vendor_boot
इमेज में दी गई इमेज ही वैंडर की रैमडिस्क का एकमात्र फ़्रैगमेंट बन जाए. - वेंडर की रैमडिस्क टेबल में साइज़ और ऑफ़सेट का फिर से हिसाब लगाता है.
- नई
vendor_boot
इमेज को फ़्लैश करता है.
- यह वैंडर की पूरी रैमडिस्क को दी गई इमेज से बदल देता है, ताकि
- अगर वेंडर बूट हेडर वर्शन
3 है, तो यह ये काम करता है:
fastboot flash vendor_boot:foo vendor-ramdisk.img
vendor_boot image
को फ़ेच करता है, जैसे किfastboot fetch
को कॉल किया गया हो.- अगर वेंडर बूट हेडर का वर्शन 3 है, तो यह गड़बड़ी दिखाता है.
अगर वेंडर बूट हेडर का वर्शन 4 है, तो यह ये काम करता है:
ramdisk_<var><foo></var>
नाम वाला वेंडर रैमडिस्क फ़्रैगमेंट ढूंढता है. अगर कोई मैच नहीं मिलता है या एक से ज़्यादा मैच मिलते हैं, तो गड़बड़ी का मैसेज दिखता है.- वेंडर के रैमडिस्क फ़्रैगमेंट को दी गई इमेज से बदल देता है.
- वेंडर की रैमडिस्क टेबल में हर साइज़ और ऑफ़सेट का फिर से हिसाब लगाता है.
- नई
vendor_boot
इमेज को फ़्लैश करता है.
अगर <foo> की वैल्यू नहीं दी गई है, तो यह
ramdisk_
ढूंढने की कोशिश करता है.
mkbootimg
default
नाम, Android 12 और उसके बाद के वर्शन में वेंडर के ramdisk फ़्रैगमेंट के नाम के लिए रिज़र्व है. फ़ास्टबूट flash vendor_boot:default
सेमेंटेक्स पहले जैसे ही रहेंगे. हालांकि, आपको अपने रैमडिस्क फ़्रैगमेंट का नाम default
के तौर पर नहीं रखना चाहिए.
SELinux में हुए बदलाव
वेंडर की रैम डिस्क को फ़्लैश करने की सुविधा देने के लिए, fastbootd.te
में बदलाव किया गया है.