انتقال راه‌اندازی سریع به فضای کاربر

راه‌اندازی سریع نام حالت و واحد bootloader است. ‫Android 10 و نسخه‌های بالاتر با انتقال پیاده‌سازی fastboot از bootloader به فضای کاربر از پارتیشن‌های تغییرپذیر پشتیبانی می‌کند. این جابه‌جایی امکان انتقال کد فلش کردن را به یک مکان مشترک قابل‌نگهداری و آزمایش‌پذیر فراهم می‌کند، درحالی‌که فقط بخش‌های خاص فروشنده fastboot توسط یک لایه انتزاعی سخت‌افزار (HAL) پیاده‌سازی می‌شود. علاوه‌براین، Android 12 و نسخه‌های بالاتر از فلش کردن دیسک‌های حافظه دسترسی تصادفی ازطریق فرمان fastboot اضافه‌شده پشتیبانی می‌کند.

یکپارچه‌سازی راه‌اندازی سریع و بازیابی

ازآنجاکه کاربران فضای سریع و بازیابی مشابه هستند، می‌توانید آن‌ها را در یک پارتیشن یا باینری ادغام کنید. این کار مزایایی دارد، ازجمله استفاده از فضای کمتر، داشتن بخش‌های کمتر درمجموع، و داشتن fastboot و بازیابی که هسته و کتابخانه‌هایشان را هم‌رسانی می‌کنند.

Fastbootd نام یک حالت و شبح فضای کاربر است. برای پشتیبانی از fastbootd، بوت‌لودر باید فرمان جدید بلوک کنترل بوت (BCB) boot-fastboot را پیاده‌سازی کند. برای ورود به حالت fastbootd، bootloader boot-fastboot را در فیلد فرمان پیام BCB می‌نویسد و فیلد recovery BCB را بدون تغییر باقی می‌گذارد (تا امکان بازراه‌اندازی هرگونه تکلیف بازیابی قطع‌شده فراهم شود). فیلدهای status، stage، و reserved نیز بدون تغییر باقی می‌مانند. بارکننده راه‌اندازی با دیدن boot-fastboot در فیلد فرمان BCB، تصویر بازیابی را بار می‌کند و با آن راه‌اندازی می‌شود. سپس «بازیابی» پیام BCB را تجزیه می‌کند و به حالت fastbootd می‌رود.

فرمان‌های ADB

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

فرمان شرح
reboot fastboot
  • به fastbootd (سیستم) بازراه‌اندازی می‌شود.
  • بدون بازراه‌اندازی (بازیابی)، مستقیماً وارد fastbootd می‌شود.

فرمان‌های راه‌اندازی سریع

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

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

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

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

در Android 12 و بالاتر برای پشتیبانی از رام‌دیسک‌های فروشنده چشمک‌زن استفاده کنید.

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

برای جزئیات، fastboot fetch vendor_boot <out.img> را ببینید.

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

برای پشتیبانی از نوشتن ramdisk فروشنده، در Android 12 و نسخه‌های بالاتر استفاده کنید.

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

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

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

تصویر vendor_boot را واکشی می‌کند. اگر سرایند راه‌اندازی فروشنده نسخه ۳ باشد، خطایی برمی‌گرداند. اگر نسخه ۴ باشد، تکه‌دیسک RAM فروشنده صحیح را (درصورت وجود) پیدا می‌کند. آن را با تصویر داده‌شده جایگزین می‌کند، اندازه‌ها و فاصله‌ها را دوباره محاسبه می‌کند، و 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 متغیری از bootloader دریافت می‌کند که برای نوشتن تصویر بازیابی/بوت لازم است (برای مثال، current-slot و max-download-size).
oem <command> فرمان تعریف‌شده توسط سازنده اصلی محصول.

بخش‌های پویا

راه‌انداز سیستم نباید اجازه دهد افرازهای پویا فلاش یا پاک شوند و اگر این عملیات انجام شود، باید خطا برگرداند. برای دستگاه‌های با پارتیشن پویا که به‌روزرسانی شده‌اند، ابزار fastboot (و راه‌انداز سیستم) از حالت اجباری برای چشمک زدن مستقیم پارتیشن پویا در حالت راه‌انداز سیستم پشتیبانی می‌کند. برای مثال، اگر system پارتیشن پویا در دستگاه بازسازی‌شده باشد، استفاده از فرمان fastboot --force flash system به بوت‌لودر (به‌جای fastbootd) امکان می‌دهد پارتیشن را فلش کند.

شارژ در حالت خاموش

اگر دستگاهی از شارژ در حالت خاموش پشتیبانی می‌کند یا درصورت اتصال به منبع برق به‌طور خودکار در حالت ویژه‌ای راه‌اندازی می‌شود، پیاده‌سازی فرمان fastboot oem off-mode-charge 0 باید این حالت‌های ویژه را دور بزند تا دستگاه طوری راه‌اندازی شود که انگار کاربر دکمه روشن/خاموش را فشار داده است.

لایه انتزاع سخت‌افزار سازنده اصلی محصول در حالت راه‌اندازی سریع

برای جایگزین کردن کامل بوت‌لودر fastboot،‏ fastboot باید همه فرمان‌های fastboot موجود را مدیریت کند. بسیاری از این فرمان‌ها از سازندگان تجهیزات اصلی (OEM) هستند و مستند شده‌اند اما به پیاده‌سازی سفارشی نیاز دارند. بسیاری از فرمان‌های مختص سازنده تجهیزات اصلی مستندسازی نشده‌اند برای مدیریت چنین فرمان‌هایی، fastboot HAL فرمان‌های OEM موردنیاز را مشخص می‌کند. تولیدکنندگان تجهیزات اصلی نیز می‌توانند فرمان‌های خودشان را پیاده‌سازی کنند.

تعریف 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 در دستگاه:

  1. ‫fastbootd به PRODUCT_PACKAGES در device.mk اضافه شود: PRODUCT_PACKAGES += fastbootd.

  2. مطمئن شوید که fastboot HAL،‏ boot control HAL، و health HAL به‌عنوان بخشی از تصویر بازیابی بسته‌بندی شده باشند.

  3. اجازه‌های SEPolicy مختص دستگاه موردنیاز fastbootd را اضافه کنید. برای مثال، fastbootd برای فلش کردن پارتیشن خاص دستگاه به دسترسی نوشتن در آن پارتیشن نیاز دارد. علاوه‌براین، پیاده‌سازی HAL fastboot ممکن است به اجازه‌های خاص دستگاه نیز نیاز داشته باشد.

برای اعتبارسنجی کاربران فضای fastboot، مجموعه آزمایش فروشنده (VTS) را اجرا کنید.

دیسک‌های مجازی فروشنده Flash

‫Android 12 و نسخه‌های بالاتر از رام‌دیسک‌های چشمک‌زن با فرمان fastboot اضافه‌شده‌ای که تصویر کامل vendor_boot را از دستگاه می‌کشد پشتیبانی می‌کند. این فرمان از ابزار راه‌اندازی سریع سمت میزبان می‌خواهد تا سرایند راه‌اندازی فروشنده را بخواند، تصویر را بازسازی کند، و تصویر جدید را فلش کند.

برای دریافت تصویر کامل vendor_boot، فرمان fetch:vendor_boot به پروتکل fastboot و پیاده‌سازی fastbootd پروتکل در Android 12 اضافه شد. توجه داشته باشید که fastbootd این را پیاده‌سازی می‌کند، اما خود بارکننده ممکن است این کار را نکند. تولیدکنندگان تجهیزات اصلی می‌توانند فرمان fetch:vendor_boot را به پیاده‌سازی بارکننده پروتکل اضافه کنند. بااین‌حال، اگر فرمان در حالت bootloader شناسایی نشود، گزینه فلش کردن ramdisk فروشنده در حالت bootloader یک گزینه پشتیبانی‌شده ازسوی فروشنده نیست.

تغییرات راه‌انداز سیستم

فرمان‌های getvar:max-fetch-size و fetch:name در fastbootd پیاده‌سازی شده‌اند. برای پشتیبانی از فلش کردن دیسک‌های مجازی RAM فروشنده در bootloader، باید این دو فرمان را پیاده‌سازی کنید.

تغییرات Fastbootd

‫getvar:max-fetch-size شبیه max-download-size است. این پارامتر حداکثر اندازه‌ای را که دستگاه می‌تواند در یک پاسخ DATA ارسال کند مشخص می‌کند. گرداننده نباید اندازه‌ای بزرگ‌تر از این مقدار واکشی کند.

‫fetch:name[:offset[:size]] مجموعه‌ای از بررسی‌ها را روی دستگاه انجام می‌دهد. اگر همه موارد زیر درست باشد، فرمان fetch:name[:offset[:size]] داده‌ها را برمی‌گرداند:

  • دستگاه درحال اجرای ساخت اشکال‌زدایی است.
  • قفل دستگاه باز است (وضعیت راه‌اندازی نارنجی).
  • نام پارتیشن واکشی‌شده vendor_boot است.
  • مقدار size در محدوده ۰ < 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 است.

  • فاصله مشخص‌شده، اندازه مشخص‌نشده: size = partition_size - offset
  • هیچ‌کدام مشخص نشده است: از مقادیر پیش‌فرض برای هر دو استفاده می‌شود، size = partition_size - ۰.

برای مثال، 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

    این یک گونه ویژه از فرمان فلاش است. تصویر vendor_boot را واکشی می‌کند، انگار fastboot fetch فراخوانده شده است.

    • اگر راه‌اندازی فروشنده نسخه ۳ سرصفحه باشد، کارهای زیر را انجام می‌دهد:
      • رم‌دیسک فروشنده را با تصویر داده‌شده جایگزین می‌کند.
      • تصویر vendor_boot جدید را فلش می‌کند.
    • اگر سرصفحه راه‌اندازی فروشنده نسخه ۴ باشد، کارهای زیر را انجام می‌دهد:
      • کل ramdisk فروشنده را با تصویر داده‌شده جایگزین می‌کند تا تصویر داده‌شده تنها تکه ramdisk فروشنده در تصویر vendor_boot شود.
      • اندازه و افست را در جدول ramdisk فروشنده دوباره محاسبه می‌کند.
      • تصویر vendor_boot جدید را فلش می‌کند.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

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

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

mkbootimg

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

تغییرات SELinux

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