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

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

دمج وضعَي Fastboot وRecovery

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

Fastbootd هو اسم البرنامج الخفي لـ userspace والوضع. لتتوافق مع fastbootd، يجب أن ينفِّذ مشغِّل الإقلاع أمرًا جديدًا لوحدة التحكّم في عملية الإقلاع (BCB) من boot-fastboot. للدخول إلى وضع fastbootd، يكتب bootloaderboot-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> تغيير حجم القسم المنطقي إلى الحجم الجديد بدون تغيير محتوياته لا يمكن تنفيذ هذا الإجراء في حال عدم توفّر مساحة كافية لإجراء تغيير الحجم.
update-super <partition> يدمج التغييرات التي تم إجراؤها على البيانات الوصفية للقسم المميز. إذا لم يكن الدمج ممكنًا (على سبيل المثال، إذا كان التنسيق على الجهاز هو إصدار غير متوافق)، يفشل هذا الإجراء. تؤدي المَعلمة الاختيارية wipe إلى استبدال metadata (البيانات الوصفية) للجهاز، بدلاً من إجراء عملية دمج.
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 والإصدارات الأحدث لتوفير دعم لفلاش ذاكرة التخزين المؤقت للمورّد

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

طبقة تجريد الأجهزة (HAL) للمصنّع الأصلي للجهاز في Fastboot

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

تعريف 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 وعنصر التحكم في التشغيل (HAL) في Fastboot (HAL) وHAL (HAL) للصحة كجزء من صورة الاسترداد.

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

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

أقراص RAM لأجهزة Flash

يتيح نظام التشغيل 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 لتسمية أجزاء ذاكرة الوصول العشوائي للمورّد في الإصدار 12 من Android والإصدارات الأحدث. على الرغم من أنّ دلالات flash vendor_boot:default fastboot تظل كما هي، يجب عدم تسمية أجزاء ملف ramdisk باسم default.

التغييرات على SELinux

تم إجراء تغيير في fastbootd.te لدعم التخلّص من المشاكل التي يواجهها المورّدون.