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

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

توحيد Fastboot واسترداد الحساب

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

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

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

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

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

تُستخدم هذه السياسة في نظام التشغيل Android 12 والإصدارات الأحدث لإتاحة الإصدارات الوامضة من قِبل المورّدين.

وهذا شكل خاص من أمر الفلاش. وهي تؤدي وظيفة صورة 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. أما إذا كان الإصدار 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 أوامر المصنّع الأصلي للجهاز المطلوبة. يمكن للمصنّعين الأصليين للأجهزة أيضًا تنفيذ أوامرهم الخاصة.

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

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

للتحقق من صحة سياسة Fastspace for userspace، يمكنك تشغيل أداة اختبار المورِّدين (VTS).

ملفات عشوائية لبائعي Flash

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

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

التغييرات التي طرأت على برنامج الإقلاع

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

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

على سبيل المثال، يجلب fetch:foo قسم foo بالكامل بالإزاحة 0.

تغييرات برامج التشغيل

تمت إضافة أوامر إلى أداة Fastboot لتنفيذ تغييرات برنامج التشغيل. يرتبط كل منها بتعريفه الكامل في جدول Fastboot commands.

  • 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، سيتم إجراء ما يلي:
      • لاستبدال ذاكرة التخزين المؤقت للبائع بالصورة المحددة.
      • يؤدي هذا الإجراء إلى عرض وميض الصورة vendor_boot الجديدة.
    • إذا كان رأس تشغيل المورّد هو الإصدار 4، سيتم إجراء ما يلي:
      • يستبدل رمز القرص الكامل للمورّد بالصورة المحدّدة بحيث تصبح الصورة المحددة الجزء الوحيد من القرص المضغوط للمورّد في صورة vendor_boot.
      • لإعادة حساب الحجم والإزاحة في جدول RAMD للمورد.
      • يؤدي هذا الإجراء إلى عرض وميض الصورة vendor_boot الجديدة.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    لجلب vendor_boot image، كما لو تم استدعاء fastboot fetch.

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

      • للعثور على جزء ذاكرة الوصول العشوائي للمورّد الذي يحمل الاسم foo. إذا لم يتم العثور عليه، أو إذا كانت هناك مطابقات متعددة، فسيتم إرجاع خطأ.
      • لاستبدال جزء ذاكرة الوصول العشوائي للمورّد بالصورة المحددة.
      • يعيد حساب كل حجم وإزاحة في جدول ذاكرة التخزين المؤقت للمورد.
      • يؤدي هذا الإجراء إلى عرض وميض الصورة vendor_boot الجديدة.

علامة mkbootimg

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

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

تم إجراء تغيير في fastbootd.te لدعم التدخُّل الذي يحدثه البائعون.