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

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

توحيد fastboot والاسترداد

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

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 في محاولة التشغيل التالية، يتم تشغيل النظام من الفتحة المحدّدة.

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

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

يُستخدم في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث لـ إتاحة فلاش vendor ramdisks.

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

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

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

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

هذا هو نوع خاص من أمر الفلاش. ينفّذ وظيفة صورة 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> يُستخدم في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث لإتاحة فلاش vendor ramdisks.

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

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

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

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

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

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

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

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

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

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

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

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

فلاش vendor ramdisks

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

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

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

يتم تنفيذ الأمرَين getvar:max-fetch-size وfetch:name في fastbootd. لإتاحة فلاش vendor ramdisks في برنامج الإقلاع، يجب تنفيذ هذَين الأمرَين.

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

    يحصل على vendor_boot image، كما لو تم استدعاء fastboot fetch.

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

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

mkbootimg

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

تغييرات SELinux

تم إجراء تغيير في fastbootd.te لإتاحة فلاش vendor ramdisks.