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

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

توحيد وضعَي Fastboot وRecovery

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

Fastbootd هو اسم وضع وبرنامج خفي في مساحة المستخدم. لإتاحة fastbootd، يجب أن ينفّذ برنامج التحميل أمرًا جديدًا لكتلة التحكّم في التشغيل (BCB) من boot-fastboot. للدخول إلى وضع fastbootd، يكتب برنامج التشغيل boot-fastboot في حقل الأوامر الخاص برسالة BCB ويترك حقل recovery الخاص برسالة BCB بدون تغيير (لإتاحة إعادة تشغيل أي مهام استرداد تمت مقاطعتها). لن يتم إجراء أي تغييرات على الحقول status وstage وreserved أيضًا. يحمّل برنامج التشغيل ويتم تشغيله في صورة الاسترداد عند ظهور boot-fastboot في حقل أمر BCB. بعد ذلك، يحلّل وضع الاسترداد رسالة BCB وينتقل إلى وضع fastbootd.

أوامر ADB

يوضّح هذا القسم الأمر adb لدمج fastbootd. تختلف نتائج الأمر استنادًا إلى ما إذا كان يتم تنفيذه من خلال النظام أو من خلال وضع الاسترداد.

الأمر الوصف
reboot fastboot
  • إعادة التشغيل إلى fastbootd (النظام)
  • إدخال fastbootd مباشرةً بدون إعادة التشغيل (الاسترداد)

أوامر Fastboot

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

في نظام التشغيل Android، تكون الفتحات عبارة عن مجموعات مكرّرة من الأقسام التي يمكن تشغيلها بشكل مستقل. تُسمّى الفتحات a وb وما إلى ذلك، ويتم التمييز بينها من خلال إضافة اللاحقات _a و_b وما إلى ذلك إلى اسم القسم.

reboot تعيد هذه الطريقة تشغيل الجهاز بشكل طبيعي.
reboot-bootloader (أو reboot bootloader) تعيد تشغيل الجهاز في برنامج الإقلاع.
fastboot fetch vendor_boot <out.img>

يُستخدَم في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث لإتاحة تثبيت ملفات ramdisk خاصة بالمورّد.

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

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

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

يُستخدم في Android 12 والإصدارات الأحدث لتوفير إمكانية تنزيل ملفات ramdisk خاصة بالمورّد.

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

يجلب صورة vendor_boot. تعرض هذه السمة خطأً إذا كان عنوان بدء التشغيل الخاص بالمورّد هو الإصدار 3. إذا كان الإصدار 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> أمر يحدّده المصنّع الأصلي للجهاز

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

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

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

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

طبقة تجريد الأجهزة (HAL) الخاصة بـ Fastboot OEM

لاستبدال أداة fastboot الخاصة ببرنامج bootloader بالكامل، يجب أن تتعامل أداة fastboot مع جميع أوامر fastboot الحالية. العديد من هذه الأوامر مصدرها الشركات المصنّعة للأجهزة الأصلية وهي موثّقة ولكنها تتطلّب تنفيذًا مخصّصًا. لا تتوفّر مستندات للعديد من الأوامر الخاصة بمصنّعين أصليين للأجهزة. للتعامل مع هذه الأوامر، يحدّد Fastboot HAL أوامر 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. تأكَّد من تضمين fastboot HAL وboot control HAL وhealth HAL في حزمة صورة الاسترداد.

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

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

Flash vendor ramdisks

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

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

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

يتم تنفيذ الأمرَين 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 (أو كليهما)، يتم استخدام القيم التلقائية، وهي 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

    هذا هو نوع خاص من أمر الفلاش. يتم جلب 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، سيتم عرض خطأ.
    • إذا كان عنوان vendor boot هو الإصدار 4، سيتم تنفيذ ما يلي:

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

mkbootimg

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

تغييرات SELinux

تم إجراء تغيير في fastbootd.te للسماح بتثبيت ramdisk خاص بالمورّد.