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

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

دمج وضعَي Fastboot وRecovery

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

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

وهذا شكل خاص من أمر الفلاش. تُنفِّذ دالة صورة 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 أوامر 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 وHAL للتحكم في التشغيل السريع وHAL وHAL الصحي كجزء من صورة الاستعادة.

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

للتحقّق من صحة نظام Fastboot مساحة المستخدم، يمكنك تشغيل أداة اختبار المورّد (Vendor Test Suite) (VTS):

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

يتوافق الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث مع ملفات تعريف الارتباط الوامضة مع إضافة أمر Fastboot (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 (أو كليهما)، يتم استخدام القيم التلقائية، والتي تكون فيها offset هي 0، وبالنسبة إلى size هي القيمة المحسوبة partition_size - offset.

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

تغييرات SELinux

تم إجراء تغيير في fastbootd.te لدعم الهزات القصيرة التي يمكن أن يواجهها البائعون.