فستبوت نام یک ماژول و حالت بوتلودر است. اندروید ۱۰ و بالاتر با جابجایی پیادهسازی فستبوت از بوتلودر به فضای کاربری، از پارتیشنهای قابل تغییر اندازه پشتیبانی میکند. این جابجایی امکان انتقال کد فلشینگ به یک مکان مشترک قابل نگهداری و آزمایش را فراهم میکند که تنها بخشهای خاص فستبوت توسط یک لایه انتزاعی سختافزاری (HAL) پیادهسازی شدهاند. علاوه بر این، اندروید ۱۲ و بالاتر از طریق یک دستور فستبوت اضافه شده، از فلش کردن رمدیسکها پشتیبانی میکند.
یکپارچهسازی فستبوت و ریکاوری
از آنجا که فستبوت و ریکاوری فضای کاربری مشابه هستند، میتوانید آنها را در یک پارتیشن یا فایل باینری ادغام کنید. این کار مزایایی مانند استفاده از فضای کمتر، داشتن پارتیشنهای کمتر و اشتراکگذاری کرنل و کتابخانههای فستبوت و ریکاوری را فراهم میکند.
Fastbootd نام یک دیمن و حالت فضای کاربری است. برای پشتیبانی از fastbootd ، بوتلودر باید یک دستور جدید بلوک کنترل بوت (BCB) به نام boot-fastboot را پیادهسازی کند. برای ورود به حالت fastbootd ، بوتلودر boot-fastboot را در فیلد فرمان پیام BCB مینویسد و فیلد recovery BCB را بدون تغییر باقی میگذارد (تا امکان راهاندازی مجدد هرگونه وظیفه بازیابی متوقفشده را فراهم کند). فیلدهای status ، stage و reserved نیز بدون تغییر باقی میمانند. بوتلودر با دیدن boot-fastboot در فیلد فرمان BCB، بارگذاری شده و به حالت بازیابی بوت میشود. سپس Recovery پیام BCB را تجزیه کرده و به حالت fastbootd تغییر حالت میدهد.
دستورات ADB
این بخش دستور adb برای ادغام fastbootd را شرح میدهد. این دستور بسته به اینکه توسط سیستم یا ریکاوری اجرا شود، نتایج متفاوتی دارد.
| فرمان | توضیحات |
|---|---|
reboot fastboot |
|
دستورات فستبوت
این بخش دستورات fastboot برای ادغام fastbootd ، از جمله دستورات جدید برای فلش کردن و مدیریت پارتیشنهای منطقی را شرح میدهد. برخی از دستورات بسته به اینکه توسط bootloader یا fastbootd اجرا شدهاند، نتایج متفاوتی دارند.
| فرمان | توضیحات |
|---|---|
reboot recovery |
|
reboot fastboot | دوباره به fastbootd راه اندازی می شود. |
getvar is-userspace |
|
getvar is-logical: <partition> | اگر پارتیشن داده شده یک پارتیشن منطقی باشد، no در غیر این صورت yes را برمیگرداند. پارتیشنهای منطقی از تمام دستورات ذکر شده در زیر پشتیبانی میکنند. |
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> | در اندروید ۱۲ و بالاتر برای پشتیبانی از فلش کردن رمدیسکهای فروشندگان استفاده میشود. اندازه کل پارتیشن و اندازه تکه را دریافت میکند. دادهها را برای هر تکه دریافت میکند، سپس دادهها را به هم میچسباند و در برای جزئیات بیشتر، به |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | در اندروید ۱۲ و بالاتر برای پشتیبانی از فلش کردن رمدیسکهای فروشندگان استفاده میشود. این یک نوع خاص از دستور flash است. این دستور تابع برای جزئیات بیشتر، به |
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 تعریف شده است. |
پارتیشنهای پویا
بوت لودر نباید اجازه فلش کردن یا پاک کردن پارتیشنهای پویا را بدهد و در صورت انجام این عملیات، باید خطا برگرداند. برای دستگاههای پارتیشن پویای ارتقا یافته، ابزار fastboot (و بوت لودر) از حالت اجباری برای فلش کردن مستقیم یک پارتیشن پویا در حالت بوت لودر پشتیبانی میکند. به عنوان مثال، اگر system یک پارتیشن پویا در دستگاه ارتقا یافته باشد، استفاده از دستور fastboot --force flash system بوت لودر (به جای fastbootd ) را قادر میسازد تا پارتیشن را فلش کند.
شارژ در حالت خاموش
اگر دستگاهی از شارژ خارج از حالت پشتیبانی کند یا در غیر این صورت هنگام اتصال برق به طور خودکار در یک حالت خاص بوت شود، پیادهسازی دستور fastboot oem off-mode-charge 0 باید این حالتهای خاص را دور بزند، به طوری که دستگاه طوری بوت شود که انگار کاربر دکمه پاور را فشار داده است.
فستبوت OEM HAL
برای جایگزینی کامل بوت لودر فست بوت، فست بوت باید تمام دستورات فست بوت موجود را مدیریت کند. بسیاری از این دستورات از OEMها هستند و مستند شدهاند اما نیاز به پیادهسازی سفارشی دارند. بسیاری از دستورات مخصوص OEM مستند نشدهاند . برای مدیریت چنین دستوراتی، 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 نیز ممکن است به مجوزهای مختص دستگاه نیاز داشته باشد.
برای اعتبارسنجی فستبوت فضای کاربری، مجموعه تست فروشنده (VTS) را اجرا کنید.
رمدیسکهای فروشنده فلش
اندروید ۱۲ و بالاتر از فلش کردن ramdiskها با یک دستور fastboot اضافه شده پشتیبانی میکند که ایمیج کامل vendor_boot را از دستگاه دریافت میکند. این دستور، ابزار fastboot سمت میزبان را وادار میکند تا هدر بوت فروشنده را بخواند، ایمیج جدید را بگیرد و ایمیج جدید را فلش کند.
برای دریافت تصویر کامل vendor_boot ، دستور fetch:vendor_boot هم به پروتکل fastboot و هم به پیادهسازی fastbootd این پروتکل در اندروید ۱۲ اضافه شد. توجه داشته باشید که fastbootd این قابلیت را پیادهسازی میکند ، اما ممکن است خود بوتلودر این قابلیت را نداشته باشد. تولیدکنندگان اصلی تجهیزات (OEM) میتوانند دستور fetch:vendor_boot به پیادهسازی بوتلودر این پروتکل اضافه کنند. با این حال، اگر این دستور در حالت بوتلودر شناسایی نشود، فلش کردن رمدیسکهای تکی فروشندگان در حالت بوتلودر، گزینهای نیست که توسط فروشنده پشتیبانی شود.
تغییرات بوت لودر
دستورات getvar:max-fetch-size و fetch:name در fastbootd پیادهسازی شدهاند. برای پشتیبانی از فلش کردن ramdiskهای تولیدکنندگان در بوتلودر، باید این دو دستور را پیادهسازی کنید.
تغییرات فستبوت
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 برابر با ۰ و برای size برابر با مقدار محاسبهشده partition_size - offset است.
- مقدار offset مشخص شده، اندازه نامشخص:
size = partition_size - offset - هیچکدام مشخص نشده است: مقادیر پیشفرض برای هر دو استفاده میشود،
size = partition_size- 0.
برای مثال، fetch:foo کل پارتیشن foo را در آفست ۰ واکشی میکند.
تغییرات درایور
دستوراتی برای اعمال تغییرات درایور به ابزار 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این یک نوع خاص از دستور flash است. این دستور، تصویر
vendor_bootرا واکشی میکند، درست مثل زمانی کهfastboot fetchفراخوانی شده باشد.- اگر بوت فروشنده نسخه هدر ۳ باشد، موارد زیر را انجام میدهد:
- ramdisk فروشنده را با تصویر داده شده جایگزین میکند.
- ایمیج جدید
vendor_bootفلش میکند.
- اگر هدر بوت فروشنده نسخه ۴ باشد، موارد زیر را انجام میدهد:
- کل ramdisk فروشنده را با تصویر داده شده جایگزین میکند، به طوری که تصویر داده شده تنها قطعه ramdisk فروشنده در تصویر
vendor_bootباشد. - اندازه و آفست را در جدول ramdisk فروشنده دوباره محاسبه میکند.
- ایمیج جدید
vendor_bootفلش میکند.
- کل ramdisk فروشنده را با تصویر داده شده جایگزین میکند، به طوری که تصویر داده شده تنها قطعه ramdisk فروشنده در تصویر
- اگر بوت فروشنده نسخه هدر ۳ باشد، موارد زیر را انجام میدهد:
fastboot flash vendor_boot:foo vendor-ramdisk.imgvendor_boot imageدریافت میکند، درست مثل اینکهfastboot fetchفراخوانی شده باشد.- اگر هدر بوت فروشنده نسخه ۳ باشد، خطا برمیگرداند.
اگر هدر بوت فروشنده نسخه ۴ باشد، موارد زیر را انجام میدهد:
- قطعه کد ramdisk فروشنده با نام
ramdisk_<var><foo></var>را پیدا میکند. اگر پیدا نشد، یا اگر چندین مورد منطبق وجود داشته باشد، خطا برمیگرداند. - قطعه ramdisk فروشنده را با تصویر داده شده جایگزین میکند.
- هر اندازه و آفست را در جدول ramdisk فروشنده دوباره محاسبه میکند.
- ایمیج جدید
vendor_bootفلش میکند.
- قطعه کد ramdisk فروشنده با نام
اگر <foo> مشخص نشده باشد، سعی میکند
ramdisk_پیدا کند.
mkbootimg
نام default برای نامگذاری قطعات ramdisk فروشنده در اندروید ۱۲ و بالاتر رزرو شده است. در حالی که معنای flash vendor_boot:default بدون تغییر باقی میماند، شما نباید قطعات ramdisk خود را به صورت default نامگذاری کنید.
تغییرات SELinux
تغییری در fastbootd.te ایجاد شد تا از فلش کردن رمدیسکهای فروشندگان پشتیبانی کند.