يدعم 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 |
|
أوامر Fastboot
يصف هذا القسم أوامر fastboot لدمج fastbootd
، بما في ذلك أوامر جديدة لوميض الأقسام المنطقية وإدارتها. بعض الأوامر لها نتائج مختلفة ، اعتمادًا على ما إذا تم تنفيذها بواسطة أداة تحميل التشغيل أو fastbootd
.
أمر | وصف |
---|---|
reboot recovery |
|
reboot fastboot | إعادة التشغيل إلى fastbootd . |
getvar is-userspace |
|
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 المقدمة على أنها بالنسبة لدعم A / B ، فإن الفتحات عبارة عن مجموعات مكررة من الأقسام التي يمكن تمهيدها بشكل مستقل. تتم تسمية الفتحات باسم |
reboot | يعيد تشغيل الجهاز بشكل طبيعي. |
reboot-bootloader (أو reboot bootloader ) | يعيد تشغيل الجهاز في محمل الإقلاع. |
fastboot fetch vendor_boot <out.img> | استخدم في Android 12 والإصدارات الأحدث لدعم أقراص البائع الوامضة. الحصول على حجم القسم بالكامل وحجم القطعة. الحصول على البيانات لكل قطعة ، ثم دمج البيانات معًا في للحصول على التفاصيل ، راجع |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | استخدم في Android 12 والإصدارات الأحدث لدعم أقراص البائع الوامضة. هذا هو البديل الخاص لأمر الفلاش. وهي تؤدي وظيفة لمزيد من التفاصيل ، راجع |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | استخدم في Android 12 والإصدارات الأحدث لدعم أقراص البائع الوامضة. يجلب الصورة للحصول على التفاصيل ، راجع |
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
على الجهاز:
أضف
fastbootd
إلىPRODUCT_PACKAGES
فيdevice.mk
:PRODUCT_PACKAGES += fastbootd
.تأكد من حزم fastboot HAL والتحكم في التمهيد HAL و health HAL كجزء من صورة الاسترداد.
أضف أي أذونات 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
الجديدة.
- يستبدل ذاكرة الوصول العشوائي الخاصة بالمورد بالكامل بالصورة المحددة بحيث تصبح الصورة المحددة هي الجزء الوحيد لقرص ramdisk الخاص بالمورد في صورة
- إذا كان تمهيد البائع هو الإصدار 3 من الرأس ، فإنه يقوم بما يلي:
fastboot flash vendor_boot:foo vendor-ramdisk.img
vendor_boot image
، كما لو تم استدعاءfastboot fetch
Fetch.- إذا كان رأس تمهيد البائع هو الإصدار 3 ، فإنه يقوم بإرجاع خطأ.
إذا كان رأس تمهيد البائع هو الإصدار 4 ، فإنه يقوم بما يلي:
- البحث عن جزء ramdisk الخاص بالمورد بالاسم
foo
. إذا لم يتم العثور ، أو إذا كان هناك العديد من التطابقات ، يتم إرجاع خطأ. - يستبدل جزء ramdisk البائع بالصورة المحددة.
- يعيد حساب كل حجم وإزاحة في جدول ذاكرة الوصول العشوائي للمورد.
- يومض صورة
vendor_boot
الجديدة.
- البحث عن جزء ramdisk الخاص بالمورد بالاسم
mkbootimg
الاسم default
محجوز لتسمية أجزاء ramdisk الخاصة بالمورد في Android 12 والإصدارات الأحدث. في حين أن fastboot flash vendor_boot:default
كما هي ، يجب ألا تسمي أجزاء ramdisk الخاصة بك على أنها default
.
تغييرات SELinux
تم إجراء تغيير في fastbootd.te
لدعم وميض ramdisks البائع.