Fastboot نام یک ماژول و حالت بوت لودر است. اندروید 10 و بالاتر از پارتیشن های قابل تغییر اندازه با جابجایی پیاده سازی فست بوت از بوت لودر به فضای کاربری پشتیبانی می کند. این جابجایی امکان انتقال کدهای چشمک زن را به یک مکان مشترک قابل نگهداری و آزمایش می دهد که تنها بخش های خاص فروشنده فست بوت توسط یک لایه انتزاعی سخت افزاری (HAL) پیاده سازی شده است. علاوه بر این، اندروید 12 و بالاتر از فلش ramdisk از طریق دستور fastboot اضافه شده پشتیبانی می کند.
یکپارچه سازی فست بوت و بازیابی
از آنجایی که fastboot و بازیابی userspace مشابه هستند، می توانید آنها را در یک پارتیشن یا باینری ادغام کنید. این مزیت هایی مانند استفاده از فضای کمتر، داشتن پارتیشن های کمتر به طور کلی، و اشتراک گذاری فست بوت و بازیابی هسته و کتابخانه ها را فراهم می کند.
Fastbootd نام دیمون و حالت فضای کاربری است. برای پشتیبانی از fastbootd
، بوت لودر باید یک فرمان بلوک کنترل بوت جدید (BCB) از boot-fastboot
را اجرا کند. برای ورود به حالت fastbootd
، bootloader boot-fastboot
در قسمت فرمان پیام BCB مینویسد و قسمت recovery
BCB را بدون تغییر میگذارد (برای فعال کردن راهاندازی مجدد وظایف بازیابی قطع شده). status
، stage
و فیلدهای reserved
نیز بدون تغییر باقی می مانند. بوت لودر با مشاهده boot-fastboot
در فیلد فرمان BCB، تصویر بازیابی بارگیری و بوت می شود. سپس Recovery پیام BCB را تجزیه می کند و به حالت fastbootd
می رود.
دستورات ADB
این بخش دستور adb
را برای یکپارچه سازی fastbootd
توضیح می دهد. این دستور بسته به اینکه توسط سیستم اجرا شود یا توسط بازیابی، نتایج متفاوتی دارد.
فرمان | توضیحات |
---|---|
reboot fastboot |
|
دستورات Fastboot
این بخش دستورات fastboot را برای یکپارچه سازی fastbootd
، از جمله دستورات جدید برای فلش کردن و مدیریت پارتیشن های منطقی توضیح می دهد. برخی از دستورات بسته به اینکه توسط bootloader یا 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> | اندازه پارتیشن منطقی را بدون تغییر محتویات آن به اندازه جدید تغییر می دهد. اگر فضای کافی برای انجام تغییر اندازه وجود نداشته باشد، ناموفق است. |
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> | در Android 12 و بالاتر برای پشتیبانی از ramdisks فروشنده فلش استفاده کنید. کل اندازه پارتیشن و اندازه تکه را دریافت می کند. داده ها را برای هر تکه دریافت می کند، سپس داده ها را به برای جزئیات، به |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | در Android 12 و بالاتر برای پشتیبانی از ramdisks فروشنده فلش استفاده کنید. این یک نوع خاص از دستور فلش است. این تابع تصویر برای جزئیات، به |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | در Android 12 و بالاتر برای پشتیبانی از ramdisks فروشنده فلش استفاده کنید. تصویر برای جزئیات، به |
فست بوت و بوت لودر
بوت لودر پارتیشن های 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. |
پارتیشن های پویا
بوت لودر نباید اجازه چشمک زدن یا پاک کردن پارتیشن های پویا را بدهد و در صورت تلاش برای انجام این عملیات، باید خطا را برگرداند. برای دستگاههای پارتیشن پویا مجهز، ابزار fastboot (و بوت لودر) از حالت نیرو پشتیبانی میکند تا مستقیماً یک پارتیشن پویا را در حالت بوتلودر فلش کند. برای مثال، اگر system
یک پارتیشن پویا در دستگاه مجهز شده است، با استفاده از دستور fastboot --force flash system
بوت لودر را قادر می سازد (به جای fastbootd
) پارتیشن را فلش کند.
شارژ خارج از حالت
اگر دستگاهی از شارژ خارج از حالت پشتیبانی میکند یا در غیر این صورت هنگام استفاده از برق به حالت خاصی راهاندازی میشود، اجرای دستور fastboot oem off-mode-charge 0
باید این حالتهای ویژه را دور بزند، به طوری که دستگاه بهگونهای بوت شود که گویی کاربر فشار داده است. دکمه پاور
Fastboot OEM HAL
برای جایگزینی کامل bootloader 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
بهPRODUCT_PACKAGES
درdevice.mk
:PRODUCT_PACKAGES += fastbootd
.مطمئن شوید که HAL fastboot، HAL کنترل بوت و HAL سلامت به عنوان بخشی از تصویر بازیابی بسته بندی شده اند.
هر گونه مجوز SEPolicy خاص دستگاه مورد نیاز
fastbootd
را اضافه کنید. برای مثال،fastbootd
برای فلش کردن آن پارتیشن نیاز به دسترسی نوشتن به یک پارتیشن مخصوص دستگاه دارد. بعلاوه، اجرای fastboot HAL ممکن است به مجوزهای خاص دستگاه نیز نیاز داشته باشد.
برای تأیید اعتبار fastboot فضای کاربران، مجموعه تست فروشنده (VTS) را اجرا کنید.
رام دیسک های فروشنده فلش
اندروید 12 و بالاتر از فلش ramdisk با دستور fastboot اضافه شده پشتیبانی میکند که تصویر vendor_boot
کامل را از دستگاه میکشد. دستور از ابزار fastboot سمت میزبان میخواهد هدر راهاندازی فروشنده را بخواند، تصویر جدید را دوباره تصویر کند و تصویر جدید را فلش کند.
برای کشیدن تصویر vendor_boot
کامل، دستور fetch:vendor_boot
به پروتکل fastboot و اجرای fastbootd پروتکل در اندروید 12 اضافه شد. توجه داشته باشید که fastbootd این را اجرا می کند، اما خود بوت لودر ممکن است این کار را انجام ندهد. OEM ها می توانند دستور fetch:vendor_boot
را به پیاده سازی بوت لودر پروتکل خود اضافه کنند. با این حال، اگر فرمان در حالت بوت لودر شناسایی نشود، فلش کردن رم دیسک های تک تک فروشنده در حالت بوت لودر یک گزینه پشتیبانی شده توسط فروشنده نیست.
تغییرات بوت لودر
دستورات getvar:max-fetch-size
و fetch:name
در fastbootd
پیاده سازی شده اند. برای پشتیبانی از ramdisk های فروشنده فلش در بوت لودر، باید این دو دستور را پیاده سازی کنید.
تغییرات 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
است.
- Offset مشخص شده، اندازه نامشخص:
size = partition_size - offset
- هیچ کدام مشخص نشده است: مقادیر پیش فرض استفاده شده برای هر دو،
size = partition_size
- 0.
برای مثال fetch:foo
کل پارتیشن foo
را با offset 0 واکشی می کند.
تغییر درایور
برای اجرای تغییرات درایور دستوراتی به ابزار fastboot اضافه شد. هر کدام به تعریف کامل خود در جدول دستورات 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 باشد، موارد زیر را انجام می دهد:
- ramdisk فروشنده را با تصویر داده شده جایگزین می کند.
- تصویر
vendor_boot
جدید را فلش می کند.
- اگر هدر بوت فروشنده نسخه 4 باشد، موارد زیر را انجام می دهد:
- کل ramdisk فروشنده را با تصویر داده شده جایگزین می کند تا تصویر داده شده تنها قطعه ramdisk فروشنده در تصویر
vendor_boot
شود. - اندازه و آفست را در جدول ramdisk فروشنده دوباره محاسبه می کند.
- تصویر
vendor_boot
جدید را فلش می کند.
- کل ramdisk فروشنده را با تصویر داده شده جایگزین می کند تا تصویر داده شده تنها قطعه ramdisk فروشنده در تصویر
- اگر بوت فروشنده نسخه هدر 3 باشد، موارد زیر را انجام می دهد:
fastboot flash vendor_boot:foo vendor-ramdisk.img
vendor_boot image
واکشی میکند، گوییfastboot fetch
فراخوانی شده است.- اگر هدر بوت فروشنده نسخه 3 باشد، یک خطا برمی گرداند.
اگر هدر بوت فروشنده نسخه 4 باشد، موارد زیر را انجام می دهد:
- قطعه ramdisk فروشنده را با نام
ramdisk_<var><foo></var>
پیدا می کند. اگر پیدا نشد، یا اگر چندین مورد منطبق وجود داشته باشد، یک خطا برمیگرداند. - قطعه ramdisk فروشنده را با تصویر داده شده جایگزین می کند.
- هر اندازه و آفست را در جدول ramdisk فروشنده دوباره محاسبه می کند.
- تصویر
vendor_boot
جدید را فلش می کند.
- قطعه ramdisk فروشنده را با نام
اگر <foo> مشخص نشده باشد، سعی می کند
ramdisk_
پیدا کند.
mkbootimg
نام default
برای نامگذاری قطعات ramdisk فروشنده در اندروید 12 و بالاتر محفوظ است. در حالی که معنای fastboot flash vendor_boot:default
ثابت می ماند، شما نباید قطعات ramdisk خود را به عنوان default
نام ببرید.
SELinux تغییر می کند
تغییری در fastbootd.te
برای پشتیبانی از ramdisks فروشنده چشمک زن ایجاد شد.