نقل Fastboot إلى Userspace

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

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

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

لدعم fastbootd ، يجب أن يقوم برنامج bootloader بتنفيذ أمر جديد للتحكم في التمهيد (BCB) من boot-fastboot . للدخول إلى وضع fastbootd ، يكتب برنامج bootloader boot-fastboot في حقل الأوامر لرسالة BCB ويترك حقل recovery لـ BCB دون تغيير (لتمكين إعادة تشغيل أي مهام استرداد متقطعة). تظل status stage والحقول reserved كما هي دون تغيير. يقوم برنامج bootloader بالتحميل والتمهيد في صورة الاسترداد عند رؤية 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> يغير حجم القسم المنطقي إلى الحجم الجديد دون تغيير محتوياته. يفشل في حالة عدم توفر مساحة كافية لإجراء تغيير الحجم.
update-super <partition> يدمج التغييرات في البيانات الوصفية للقسم الفائق. إذا لم يكن الدمج ممكنًا (على سبيل المثال ، التنسيق على الجهاز هو إصدار غير مدعوم) ، يفشل هذا الأمر. تحل معلمة wipe الاختيارية محل البيانات الأولية للجهاز ، بدلاً من إجراء دمج.
flash <partition> [ <filename> ] يكتب ملف إلى قسم فلاش. يجب أن يكون الجهاز في حالة "إلغاء التأمين".
erase <partition> يمحو قسمًا (ليس مطلوبًا ليكون محوًا آمنًا). يجب أن يكون الجهاز في حالة "إلغاء التأمين".
getvar <variable> | all يعرض متغير محمل الإقلاع أو كل المتغيرات. في حالة عدم وجود المتغير ، يتم إرجاع خطأ.
set_active <slot>

يضبط فتحة تمهيد A / B المقدمة على أنها active . في محاولة التمهيد التالية ، يقوم النظام بالتمهيد من الفتحة المحددة.

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

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 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 ، فإنه يبحث عن جزء ramdisk البائع الصحيح (إذا كان متوفرًا). إنه يستبدل ذلك بالصورة المحددة ، ويعيد حساب الأحجام والإزاحات ، ويومض vendor_boot image الجديدة.

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

Fastboot و bootloader

يقوم برنامج bootloader بعمل وميض لأقسام 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 هذه الأوضاع الخاصة ، بحيث يتم تشغيل الجهاز كما لو كان المستخدم قد ضغط زر الطاقة.

Fastboot OEM HAL

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

لتمكين fastbootd على الجهاز:

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

  2. تأكد من حزم fastboot HAL والتحكم في التمهيد HAL و health HAL كجزء من صورة الاسترداد.

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

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

وامض ramdisks البائع

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

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

تغييرات Bootloader

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

تغييرات 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 Fetch.

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

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

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

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

mkbootimg

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

تغييرات SELinux

تم إجراء تغيير في fastbootd.te لدعم وميض ramdisks البائع.