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

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

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

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

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

أوامر بنك التنمية الآسيوي

يصف هذا القسم أمر adb لدمج fastbootd . يكون للأمر نتائج مختلفة، اعتمادًا على ما إذا كان يتم تنفيذه بواسطة النظام أو عن طريق الاسترداد.

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

أوامر التشغيل السريع

يصف هذا القسم أوامر 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> تغيير حجم القسم المنطقي إلى الحجم الجديد دون تغيير محتوياته. يفشل إذا لم تكن هناك مساحة كافية متاحة لإجراء تغيير الحجم.
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. وإذا كان الإصدار 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> الأمر المحدد بواسطة OEM.

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

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

الشحن خارج الوضع

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

فاستبوت OEM هال

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

  1. أضف fastbootd إلى PRODUCT_PACKAGES في device.mk : PRODUCT_PACKAGES += fastbootd .

  2. تأكد من أن Fastboot HAL، وHAL للتحكم في التمهيد، وHAL الصحي قد تم تجميعها كجزء من صورة الاسترداد.

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

للتحقق من صحة التشغيل السريع لمساحة المستخدم، قم بتشغيل Vendor Test Suite (VTS) .

وامض ramdisks البائع

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

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

تغييرات محمل الإقلاع

يتم تنفيذ الأمرين getvar:max-fetch-size و fetch:name في fastbootd . لدعم وميض أقراص ذاكرة الوصول العشوائي الخاصة بالمورد في أداة تحميل التشغيل، يجب عليك تنفيذ هذين الأمرين.

تغييرات التمهيد السريع

getvar:max-fetch-size يشبه max-download-size . وهو يحدد الحد الأقصى للحجم الذي يمكن للجهاز إرساله في استجابة بيانات واحدة. يجب ألا يقوم برنامج التشغيل بإحضار حجم أكبر من هذه القيمة.

يقوم 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 .
      • إعادة حساب الحجم والإزاحة في جدول قرص ذاكرة المورد.
      • يومض صورة vendor_boot الجديدة.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

    • إذا كان رأس تمهيد البائع هو الإصدار 3، فإنه يُرجع خطأ.
    • إذا كان رأس تمهيد المورد هو الإصدار 4، فإنه يقوم بما يلي:

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

mkbootimg

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

تغييرات SELinux

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