نقل Fastboot إلى مساحة المستخدم

Fastboot هو اسم وحدة ووضع مشغّل الإقلاع. يتيح نظام Android 10 والإصدارات الأحدث إنشاء أقسام قابلة للتغيير من خلال إعادة تحديد موقع تنفيذ Fastboot من محمل الإقلاع إلى مساحة المستخدم. يتيح هذا إعادة التثبيت نقل رمز التفليش إلى موقع ملف مشترك قابل للصيانة والاختبار مع تضمين الأجزاء الخاصة بالمورّد فقط من fastboot التي تنفذها طبقة HAL. بالإضافة إلى ذلك، يتيح نظام Android 12 والإصدارات الأحدث إعادة تحميل وحدات التخزين المؤقت للذاكرة من خلال أمر fastboot تمت إضافته.

دمج وضعَي Fastboot وRecovery

بما أنّ وضع الاسترداد ووضع التشغيل السريع في مساحة المستخدم متشابهان، يمكنك دمجهما في ملف ثنائي أو قسم واحد. ويقدّم ذلك مزايا مثل استخدام مساحة أقل، واستخدام أقسام أقل بشكل عام، ومشاركة بوت التشغيل السريع ووضع الاسترداد لنظام التشغيل النواة والمكتبات.

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
  • إعادة التشغيل في fastbootd (النظام)
  • الدخول إلى وضع fastbootd مباشرةً بدون إعادة تشغيل (وضع الاسترداد)

أوامر Fastboot

يصف هذا القسم أوامر Fastboot لدمج fastbootd، بما في ذلك الأوامر الجديدة لفلاش القسم المنطقي وإدارته. تؤدي بعض الأوامر إلى نتائج مختلفة، وذلك استنادًا إلى ما إذا تم تنفيذها من خلال بوتloader أو من خلال 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> تغيير حجم القسم المنطقي إلى الحجم الجديد بدون تغيير محتوياته لا يمكن تنفيذ هذا الإجراء في حال عدم توفّر مساحة كافية لإجراء تغيير الحجم.
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>

استخدامها في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث لتوفير دعم لفلاش ذاكرة التخزين المؤقت للمورّد

تحصل على حجم القسم بالكامل وحجم الجزء. الحصول على بيانات كل جزء، ثم تجميع البيانات معًا <out.img>

للاطّلاع على التفاصيل، يُرجى الاطّلاع على fastboot fetch vendor_boot <out.img>.

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

يُستخدم هذا الإصدار في Android 12 والإصدارات الأحدث لإتاحة إعادة تحميل وحدات التخزين المؤقت للأجهزة المصنّعة.

هذا هو نوع خاص من الأمر flash. تُنفِّذ دالة صورة 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 والإصدارات الأحدث لمنح إمكانية برمجة وحدات التخزين المؤقت للأجهزة المصنّعة.

جلب صورة vendor_boot تعرِض هذه السمة خطأً إذا كان الإصدار 3 هو إصدار ملف headerboot الخاص بالمورِّد. إذا كان الإصدار 4، سيعثر على جزء ذاكرة التخزين المؤقت للجهاز (ramdisk) الصحيح الخاص بالمورّد (إذا كان متاحًا). ويتم استبدالها بالصورة المحدّدة، ويعيد البرنامج احتساب الأحجام والإزاحات، ويعرض vendor_boot image الجديد.

للاطّلاع على التفاصيل، يُرجى الاطّلاع على: fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Fastboot وبرنامج الإقلاع

يُفلِش برنامج الإقلاع الأقسام bootloader وradio وboot/recovery ، وبعد ذلك يتم تشغيل الجهاز في وضع Fastboot (مساحة المستخدم) ويُفلِش جميع الأقسام الأخرى. يجب أن يتيح أداة تحميل البرامج الأوامر التالية.

الأمر الوصف
download تنزيل الصورة لفلاشها
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ إعادة تحميل قسم recovery/boot وبرنامج الإقلاع
reboot إعادة تشغيل الجهاز
reboot fastboot إعادة تشغيل الجهاز للدخول في وضع Fastboot
reboot recovery إعادة التشغيل إلى وضع الاسترداد
getvar تحصل على متغيّر برنامج الإقلاع المطلوب لفلاش ملف برمجي لإعادة التمهيد/التمهيد (على سبيل المثال، current-slot و max-download-size).
oem <command> أمر يحدّده المصنّع الأصلي للجهاز

الأقسام الديناميكية

يجب ألا يسمح مُشغِّل الإقلاع بإعادة تحميل أو محو الأقسام الديناميكية، ويجب أن يعرض خطأً في حال محاولة تنفيذ هذه العمليات. بالنسبة إلى الأجهزة التي تم تركيب ميزة القسم الديناميكي فيها لاحقًا، تتيح أداة Fastboot (وبرنامج التمهيد) وضعًا قسريًا لفلاش القسم الديناميكي مباشرةً أثناء تشغيل وضع التمهيد. على سبيل المثال، إذا كان system قسمًا ديناميكيًا على الجهاز الذي تم تركيبه لاحقًا، يؤدي استخدام الأمر fastboot --force flash system إلى تفعيل أداة تحميل البرامج التمهيدية (بدلاً من fastbootd) لفلاش القسم.

الشحن في وضع الإيقاف

إذا كان الجهاز يتيح الشحن في وضع الإيقاف أو يبدأ التشغيل التلقائي في وضع خاص عند توصيل الطاقة، يجب أن يتجاهل تنفيذ الأمر fastboot oem off-mode-charge 0 هذه الأوضاع الخاصة، لكي يتم تشغيل الجهاز كما لو ضغط المستخدم على زر التشغيل.

Fastboot OEM HAL

لاستبدال أداة fastboot الخاصة ببرنامج التمهيد بالكامل، يجب أن تعالج أداة fastboot جميع طلبات fastboot الحالية. تأتي العديد من هذه الأوامر من المصنّعين الأصليّين للأجهزة وهي موثّقة، ولكنها تحتاج إلى تنفيذ مخصّص. لم يتم توثيق العديد من الأوامر الخاصة بمصنّعي المعدّات الأصليين. لمعالجة هذه الأوامر، يحدِّد Fastboot HAL أوامر OEM المطلوبة. يمكن أيضًا لمصنّعي المعدّات الأصلية تنفيذ أوامرهم الخاصة.

تعريف HAL لميزة fastboot هو على النحو التالي:

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 وboot control وhealth مُجمَّعة كجزء من صورة الاسترداد.

  3. أضِف أي أذونات SEPolicy خاصة بالجهاز مطلوبة من قِبل fastbootd. على سبيل المثال، يتطلب fastbootd إذن الوصول للكتابة إلى قسم خاص بالجهاز لبرمجة هذا القسم. بالإضافة إلى ذلك، قد يتطلب تنفيذ HAL لميزة fastboot أيضًا أذونات خاصة بالجهاز.

للتحقّق من صحة ميزة Fastboot في مساحة المستخدم، يمكنك تشغيل مجموعة اختبارات المورّد (VTS).

أقراص RAM لأجهزة فلاش

يتيح نظام التشغيل Android 12 والإصدارات الأحدث برمجة ملف ramdisk باستخدام أمر fastboot إضافي يسحب صورة vendor_boot الكاملة من الجهاز. يطلب الأمر من أداة التحميل السريع على الجانب المضيف قراءة عنوان التمهيد الخاص بالمورِّد وإعادة تحميل الصورة وفلاش الصورة الجديدة.

لسحب صورة vendor_boot الكاملة، تمت إضافة الأمر fetch:vendor_boot إلى كل من بروتوكول fastboot وتنفيذ fastbootd للبروتوكول في Android 12. يُرجى العِلم أنّ أداة fastbootd تنفِّذ هذا الإجراء، ولكن قد لا يفعّله مشغّل الإقلاع نفسه. يمكن لمصنّعي المعدّات الأصلية إضافة الرمز fetch:vendor_boot إلى تنفيذ بوت لودر للبروتوكول. ومع ذلك، إذا لم يتم التعرّف على الأمر في وضع أداة تحميل التشغيل، لن يكون فلاش وحدات التخزين المؤقت (RAM) الفردية الخاصة بالمورّد في وضع أداة تحميل التشغيل خيارًا متاحًا لدى المورّد.

تغييرات في برنامج الإقلاع

يتم تنفيذ الأمرَين getvar:max-fetch-size وfetch:name في fastbootd. لتفعيل ميزة فلاش وحدات التخزين المؤقت للنظام الأساسي في أداة التمهيد، يجب تنفيذ هذين الأمرَين.

تغييرات 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 (أو كليهما)، يتم استخدام القيم التلقائية، وهي 0 لـ offset وpartition_size - offset لـ size.

  • تم تحديد المدة، ولكن لم يتم تحديد الحجم: size = partition_size - offset
  • لم يتم تحديد أيّ منهما: يتم استخدام القيم التلقائية لكلاهما، size = partition_size - 0.

على سبيل المثال، تُسترجع fetch:foo قسم foo بالكامل عند الإزاحة 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

    هذا هو نوع خاص من الأمر flash. ويعمل على جلب صورة vendor_boot، كما لو تمّ استدعاء fastboot fetch.

    • إذا كان العنوان الإصدار 3 في عملية التمهيد الخاصة بالمورّد، يؤدي ذلك إلى تنفيذ ما يلي:
      • استبدال ذاكرة الوصول العشوائي للمورّد بالصورة المحدّدة
      • وميضات صورة vendor_boot الجديدة
    • إذا كان رأس التمهيد الخاص بالمورّد هو الإصدار 4، ينفّذ ما يلي:
      • استبدال ذاكرة التخزين المؤقت للنظام الأساسي للمورّد بالكامل بالصورة المحدّدة لكي تصبح الصورة المحدّدة هي الجزء الوحيد من ذاكرة التخزين المؤقت للنظام الأساسي للمورّد في صورة vendor_boot
      • تُعيد احتساب الحجم والقيمة المرجعية في جدول ذاكرة التخزين المؤقت للنظام الأساسي للمورّد.
      • وميضات صورة vendor_boot الجديدة
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    تُستخدَم لتحميل vendor_boot image، كما لو تمّ استدعاء fastboot fetch.

    • إذا كان إصدار رأس التمهيد الخاص بالبائع هو 3، يتم عرض خطأ.
    • إذا كان إصدار عنوان التمهيد الخاص بالمورّد هو 4، يتم تنفيذ ما يلي:

      • يبحث عن جزء ذاكرة التخزين المؤقت للجهاز من المورّد الذي يحمل الاسم ramdisk_<var>&lt;foo></var>. في حال عدم العثور على القيمة أو إذا كانت هناك مطابقات متعدّدة، يتم عرض خطأ.
      • استبدال جزء ذاكرة التخزين المؤقت للنظام الأساسي للمورّد بالصورة المحدّدة
      • تُعيد احتساب كل حجم وقيمة إزاحة في جدول ذاكرة التخزين المؤقت للمورّد.
      • وميضات صورة vendor_boot الجديدة
    • إذا لم يتم تحديد <foo>، يحاول العثور على ramdisk_.

mkbootimg

الاسم default محجوز لتسمية أجزاء ذاكرة التخزين المؤقت للنظام الأساسي للمورّد في Android 12 والإصدارات الأحدث. على الرغم من أنّ دلالات flash vendor_boot:default fastboot تظل كما هي، يجب عدم تسمية أجزاء ملف ramdisk باسم default.

تغييرات SELinux

تم إجراء تغيير في fastbootd.te للسماح بفلاش وحدات تخزين ذاكرة الوصول العشوائي (RAM) الخاصة بالمورّدين.