انتقال Fastboot به فضای کاربری

اندروید 10 و بالاتر از پارتیشن های قابل تغییر اندازه با جابجایی پیاده سازی فست بوت از بوت لودر به فضای کاربری پشتیبانی می کند. این جابجایی امکان انتقال کدهای چشمک زن را به یک مکان مشترک قابل نگهداری و آزمایش می دهد که تنها بخش های خاص فروشنده فست بوت توسط یک لایه انتزاعی سخت افزاری (HAL) پیاده سازی شده است. علاوه بر این، اندروید 12 و بالاتر از فلش ramdisk از طریق دستور fastboot اضافه شده پشتیبانی می کند.

یکپارچه سازی فست بوت و بازیابی

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

برای پشتیبانی 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
  • راه اندازی مجدد به fastbootd (سیستم).
  • مستقیماً بدون راه اندازی مجدد (بازیابی) وارد fastbootd می شود.

دستورات Fastboot

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

فرمان شرح
reboot recovery
  • راه اندازی مجدد به ریکاوری (بوت لودر).
  • مستقیماً بدون راه‌اندازی مجدد وارد ریکاوری می‌شود ( 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> اندازه پارتیشن منطقی را بدون تغییر محتویات آن به اندازه جدید تغییر می دهد. اگر فضای کافی برای انجام تغییر اندازه وجود نداشته باشد، ناموفق است.
update-super <partition> تغییرات در ابرداده پارتیشن فوق العاده را ادغام می کند. اگر ادغام امکان پذیر نباشد (به عنوان مثال، فرمت موجود در دستگاه یک نسخه پشتیبانی نشده است)، این دستور با شکست مواجه می شود. یک پارامتر wipe اختیاری به جای انجام ادغام، فراداده دستگاه را بازنویسی می کند.
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>

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

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

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

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

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

این یک نوع خاص از دستور فلش است. این تابع تصویر fetch vendor_boot انجام می دهد، گویی که fastboot fetch فراخوانی شده است. تصویر vendor_boot جدیدی که چشمک می زند بستگی به این دارد که نسخه هدر بوت نسخه 3 یا 4 باشد.

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

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

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

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

  1. افزودن fastbootd به PRODUCT_PACKAGES در device.mk : PRODUCT_PACKAGES += fastbootd .

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

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

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

    • اگر هدر بوت فروشنده نسخه 3 باشد، یک خطا برمی گرداند.
    • اگر هدر بوت فروشنده نسخه 4 باشد، موارد زیر را انجام می دهد:

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

mkbootimg

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

SELinux تغییر می کند

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