एंड्रॉइड 10 और उच्चतर बूटलोडर से यूजरस्पेस में फास्टबूट कार्यान्वयन को स्थानांतरित करके आकार बदलने योग्य विभाजन का समर्थन करता है। यह स्थानांतरण फ्लैशिंग कोड को एक हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) द्वारा कार्यान्वित फास्टबूट के केवल विक्रेता-विशिष्ट भागों के साथ एक रखरखाव योग्य और परीक्षण योग्य सामान्य स्थान में ले जाने में सक्षम बनाता है। इसके अलावा, एंड्रॉइड 12 और उच्चतर एक अतिरिक्त फास्टबूट कमांड के माध्यम से फ्लैशिंग रैमडिस्क का समर्थन करता है।
फास्टबूट और रिकवरी को एकीकृत करना
चूंकि यूजरस्पेस फास्टबूट और रिकवरी समान हैं, आप उन्हें एक पार्टीशन या बाइनरी में मर्ज कर सकते हैं। यह कम स्थान का उपयोग करने, समग्र रूप से कम विभाजन होने और फास्टबूट और पुनर्प्राप्ति के साथ उनके कर्नेल और पुस्तकालयों को साझा करने जैसे लाभ प्रदान करता है।
Fastbootd का समर्थन करने के लिए, बूटलोडर को boot-fastboot
fastbootd
नए बूट नियंत्रण ब्लॉक (BCB) कमांड को लागू करना चाहिए। fastbootd
मोड में प्रवेश करने के लिए, बूटलोडर बीसीबी संदेश के कमांड फ़ील्ड में boot-fastboot
लिखता है और बीसीबी के recovery
क्षेत्र को अपरिवर्तित छोड़ देता है (किसी भी बाधित पुनर्प्राप्ति कार्यों को पुनरारंभ करने में सक्षम करने के लिए)। status
, stage
, और reserved
फ़ील्ड भी अपरिवर्तित रहते हैं। बूटलोडर बीसीबी कमांड फील्ड में boot-fastboot
देखने पर रिकवरी इमेज में लोड और बूट होता है। पुनर्प्राप्ति तब बीसीबी संदेश को पार्स करती है और fastbootd
मोड पर स्विच करती है।
एडीबी आदेश
यह खंड fastbootd
को एकीकृत करने के लिए adb
कमांड का वर्णन करता है। कमांड के अलग-अलग परिणाम होते हैं, यह इस बात पर निर्भर करता है कि इसे सिस्टम द्वारा निष्पादित किया गया है या पुनर्प्राप्ति द्वारा।
आदेश | विवरण |
---|---|
reboot fastboot |
|
फास्टबूट कमांड
यह खंड फास्टबूट को एकीकृत करने के लिए fastbootd
कमांड का वर्णन करता है, जिसमें फ्लैशिंग और तार्किक विभाजन के प्रबंधन के लिए नए कमांड शामिल हैं। कुछ कमांड के अलग-अलग परिणाम होते हैं, यह इस पर निर्भर करता है कि उन्हें बूटलोडर द्वारा निष्पादित किया गया है या fastbootd
द्वारा।
आदेश | विवरण |
---|---|
reboot recovery |
|
reboot fastboot | fastbootd में रीबूट करें। |
getvar is-userspace |
|
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> | दिए गए A/B बूटिंग स्लॉट को A/B समर्थन के लिए, स्लॉट विभाजन के डुप्लीकेट सेट होते हैं जिन्हें स्वतंत्र रूप से बूट किया जा सकता है। स्लॉट्स को |
reboot | डिवाइस को सामान्य रूप से रीबूट करता है। |
reboot-bootloader (या reboot bootloader ) | डिवाइस को बूटलोडर में रीबूट करता है। |
fastboot fetch vendor_boot <out.img> | फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 12 और उच्चतर में उपयोग करें। संपूर्ण विभाजन आकार और खंड आकार प्राप्त करता है। प्रत्येक खंड के लिए डेटा प्राप्त करता है, फिर डेटा को विवरण के लिए, |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 12 और उच्चतर में उपयोग करें। यह फ्लैश कमांड का एक विशेष प्रकार है। यह एक विवरण के लिए, |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए एंड्रॉइड 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
कमांड के कार्यान्वयन को इन विशेष मोड को बायपास करना चाहिए, ताकि डिवाइस बूट हो जाए जैसे कि उपयोगकर्ता ने दबाया था पावर बटन।
फास्टबूट 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
को सक्षम करने के लिए:
डिवाइस में
fastbootd
कोPRODUCT_PACKAGES
में जोड़ें।device.mk
:PRODUCT_PACKAGES += fastbootd
।सुनिश्चित करें कि फास्टबूट HAL, बूट नियंत्रण HAL, और स्वास्थ्य HAL पुनर्प्राप्ति छवि के भाग के रूप में पैक किए गए हैं।
Fastbootd द्वारा आवश्यक कोई भी उपकरण-विशिष्ट
fastbootd
अनुमतियाँ जोड़ें। उदाहरण के लिए,fastbootd
को उस विभाजन को फ्लैश करने के लिए डिवाइस-विशिष्ट विभाजन के लिए लेखन पहुंच की आवश्यकता होती है। इसके अलावा, फास्टबूट एचएएल कार्यान्वयन के लिए डिवाइस-विशिष्ट अनुमतियों की भी आवश्यकता हो सकती है।
यूज़रस्पेस फास्टबूट को सत्यापित करने के लिए, वेंडर टेस्ट सूट (वीटीएस) चलाएँ।
चमकती विक्रेता रैमडिस्क
एंड्रॉइड 12 और उच्चतर रैमडिस्क को एक अतिरिक्त फास्टबूट कमांड के साथ फ्लैश करने के लिए समर्थन प्रदान करता है जो एक डिवाइस से पूर्ण vendor_boot
छवि खींचता है। कमांड होस्ट-साइड फास्टबूट टूल को विक्रेता बूट हेडर पढ़ने, रीइमेज करने और नई छवि को फ्लैश करने के लिए प्रेरित करता है।
पूर्ण vendor_boot
छवि को खींचने के लिए, कमांड fetch:vendor_boot
को फास्टबूट प्रोटोकॉल और एंड्रॉइड 12 में प्रोटोकॉल के फास्टबूट कार्यान्वयन दोनों में जोड़ा गया था। ध्यान दें कि फास्टबूट इसे लागू करता है, लेकिन बूटलोडर स्वयं नहीं हो सकता है। 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
ऑफसेट 0 पर संपूर्ण foo
विभाजन प्राप्त करता है।
चालक परिवर्तन
ड्राइवर परिवर्तनों को लागू करने के लिए फास्टबूट टूल में कमांड जोड़े गए थे। प्रत्येक Fastboot कमांड की तालिका में इसकी पूर्ण परिभाषा से जुड़ा हुआ है।
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
छवि को फ्लैश करता है।
- पूरे विक्रेता रैमडिस्क को दी गई छवि के साथ बदल देता है ताकि दी गई छवि विक्रेता_बूट छवि में एकमात्र विक्रेता
- यदि विक्रेता बूट हेडर संस्करण 3 है, तो यह निम्न कार्य करता है:
fastboot flash vendor_boot:foo vendor-ramdisk.img
vendor_boot image
fastboot fetch
को कहा गया था।- यदि विक्रेता बूट हेडर संस्करण 3 है, तो यह एक त्रुटि देता है।
यदि विक्रेता बूट हेडर संस्करण 4 है, तो यह निम्न कार्य करता है:
-
foo
नाम के साथ विक्रेता ramdisk खंड ढूंढता है। यदि नहीं मिला, या यदि कई मिलान हैं, तो एक त्रुटि देता है। - दी गई छवि के साथ विक्रेता रैमडिस्क टुकड़े को बदल देता है।
- विक्रेता रैमडिस्क तालिका में प्रत्येक आकार और ऑफसेट की पुनर्गणना करता है।
- नई
vendor_boot
छवि को फ्लैश करता है।
-
एमकेबूटिमग
default
नाम Android 12 और उच्चतर में विक्रेता रैमडिस्क अंशों के नामकरण के लिए आरक्षित है। जबकि flash vendor_boot:default
शब्दार्थ समान रहता है, आपको अपने रैमडिस्क अंशों को default
के रूप में नाम नहीं देना चाहिए ।
SELinux परिवर्तन
फ्लैशिंग विक्रेता रैमडिस्क का समर्थन करने के लिए fastbootd.te
में एक परिवर्तन किया गया था।