فست بوت را به فضای کاربری منتقل کنید

فست‌بوت نام یک ماژول و حالت بوت‌لودر است. اندروید ۱۰ و بالاتر با جابجایی پیاده‌سازی فست‌بوت از بوت‌لودر به فضای کاربری، از پارتیشن‌های قابل تغییر اندازه پشتیبانی می‌کند. این جابجایی امکان انتقال کد فلشینگ به یک مکان مشترک قابل نگهداری و آزمایش را فراهم می‌کند که تنها بخش‌های خاص فست‌بوت توسط یک لایه انتزاعی سخت‌افزاری (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
  • دوباره به fastbootd (سیستم) راه اندازی مجدد می‌شود.
  • بدون نیاز به ریبوت (بازیابی) مستقیماً وارد fastbootd می‌شود.

دستورات فست‌بوت

این بخش دستورات fastboot برای ادغام fastbootd ، از جمله دستورات جدید برای فلش کردن و مدیریت پارتیشن‌های منطقی را شرح می‌دهد. برخی از دستورات بسته به اینکه توسط bootloader یا fastbootd اجرا شده‌اند، نتایج متفاوتی دارند.

فرمان توضیحات
reboot recovery
  • دوباره به ریکاوری (بوت لودر) راه اندازی می شود.
  • مستقیماً و بدون نیاز به راه‌اندازی مجدد ( fastbootd ) وارد ریکاوری می‌شود.
reboot fastboot دوباره به fastbootd راه اندازی می شود.
getvar is-userspace
  • مقدار yes ( fastbootd ) را برمی‌گرداند.
  • no (بوت‌لودر) را برمی‌گرداند.
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 داده شده را به عنوان active تنظیم می‌کند. در تلاش بعدی برای بوت، سیستم از اسلات مشخص شده بوت می‌شود.

برای پشتیبانی از A/B، اسلات‌ها مجموعه‌های کپی‌شده‌ای از پارتیشن‌ها هستند که می‌توانند به‌طور مستقل از آنها بوت شوند. اسلات‌ها با نام‌های a ، b و غیره نامگذاری می‌شوند و با اضافه کردن پسوندهای _a ، _b و غیره به نام پارتیشن، از یکدیگر متمایز می‌شوند.

reboot دستگاه را به طور عادی ریبوت می‌کند.
reboot-bootloader (یا reboot bootloader ) دستگاه را دوباره به بوت لودر راه اندازی می کند.
fastboot fetch vendor_boot <out.img>

در اندروید ۱۲ و بالاتر برای پشتیبانی از فلش کردن رم‌دیسک‌های فروشندگان استفاده می‌شود.

اندازه کل پارتیشن و اندازه تکه را دریافت می‌کند. داده‌ها را برای هر تکه دریافت می‌کند، سپس داده‌ها را به هم می‌چسباند و در <out.img> قرار می‌دهد.

برای جزئیات بیشتر، به fastboot fetch vendor_boot <out.img> مراجعه کنید.

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

در اندروید ۱۲ و بالاتر برای پشتیبانی از فلش کردن رم‌دیسک‌های فروشندگان استفاده می‌شود.

این یک نوع خاص از دستور flash است. این دستور تابع fetch vendor_boot image را اجرا می‌کند، درست مثل زمانی که fastboot fetch فراخوانی شده باشد. image جدید vendor_boot که فلش می‌کند بستگی به این دارد که نسخه هدر بوت نسخه ۳ باشد یا نسخه ۴.

برای جزئیات بیشتر، به fastboot flash vendor_boot:default <vendor-ramdisk.img> مراجعه کنید.

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> در اندروید ۱۲ و بالاتر برای پشتیبانی از فلش کردن رم‌دیسک‌های فروشندگان استفاده می‌شود.

تصویر vendor_boot دریافت می‌کند. اگر هدر بوت vendor نسخه ۳ باشد، خطا برمی‌گرداند. اگر نسخه ۴ باشد، قطعه ramdisk صحیح vendor (در صورت وجود) را پیدا می‌کند. آن را با تصویر داده شده جایگزین می‌کند، اندازه‌ها و آفست‌ها را دوباره محاسبه می‌کند و 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 تعریف شده است.

پارتیشن‌های پویا

بوت لودر نباید اجازه فلش کردن یا پاک کردن پارتیشن‌های پویا را بدهد و در صورت انجام این عملیات، باید خطا برگرداند. برای دستگاه‌های پارتیشن پویای ارتقا یافته، ابزار 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 در یک دستگاه:

  1. fastbootd به PRODUCT_PACKAGES در device.mk اضافه کنید: PRODUCT_PACKAGES += fastbootd .

  2. مطمئن شوید که HAL مربوط به fastboot، HAL مربوط به کنترل بوت و HAL مربوط به سلامت، به عنوان بخشی از فایل ریکاوری ایمیج بسته‌بندی شده‌اند.

  3. هرگونه مجوز 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 فلش می‌کند.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image دریافت می‌کند، درست مثل اینکه fastboot fetch فراخوانی شده باشد.

    • اگر هدر بوت فروشنده نسخه ۳ باشد، خطا برمی‌گرداند.
    • اگر هدر بوت فروشنده نسخه ۴ باشد، موارد زیر را انجام می‌دهد:

      • قطعه کد ramdisk فروشنده با نام ramdisk_<var>&lt;foo></var> را پیدا می‌کند. اگر پیدا نشد، یا اگر چندین مورد منطبق وجود داشته باشد، خطا برمی‌گرداند.
      • قطعه ramdisk فروشنده را با تصویر داده شده جایگزین می‌کند.
      • هر اندازه و آفست را در جدول ramdisk فروشنده دوباره محاسبه می‌کند.
      • ایمیج جدید vendor_boot فلش می‌کند.
    • اگر <foo> مشخص نشده باشد، سعی می‌کند ramdisk_ پیدا کند.

mkbootimg

نام default برای نامگذاری قطعات ramdisk فروشنده در اندروید ۱۲ و بالاتر رزرو شده است. در حالی که معنای flash vendor_boot:default بدون تغییر باقی می‌ماند، شما نباید قطعات ramdisk خود را به صورت default نامگذاری کنید.

تغییرات SELinux

تغییری در fastbootd.te ایجاد شد تا از فلش کردن رم‌دیسک‌های فروشندگان پشتیبانی کند.