אנדרואיד 10 ואילך תומך במחיצות הניתנות לשינוי גודל על ידי העברת יישום ה-fastboot ממטען האתחול למרחב המשתמש. העברה זו מאפשרת להעביר את הקוד המהבהב למיקום נפוץ שניתן לתחזוקה וניתן לבדיקה, כאשר רק החלקים הספציפיים לספק של fastboot מיושמים על ידי שכבת אבסטרקציה של חומרה (HAL). בנוסף, אנדרואיד 12 ואילך תומך ב-ramdisks מהבהבים באמצעות פקודת fastboot נוספת.
איחוד מהיר של אתחול והתאוששות
מכיוון שה-Fastboot והתאוששות של מרחב המשתמש דומים, אתה יכול למזג אותם למחיצה אחת או בינארית. זה מספק יתרונות כמו שימוש בפחות מקום, פחות מחיצות בסך הכל, ושיתוף מהיר של אתחול ושחזור הליבה והספריות שלהם.
כדי לתמוך fastbootd
, על טוען האתחול ליישם פקודת אתחול בקרת אתחול (BCB) חדשה של boot-fastboot
. כדי להיכנס למצב fastbootd
, טוען האתחול כותב boot-fastboot
בשדה הפקודה של הודעת BCB ומשאיר את שדה recovery
של BCB ללא שינוי (כדי לאפשר הפעלה מחדש של כל משימות שחזור שנקטעו). גם status
, stage
ושדות reserved
נשארים ללא שינוי. טוען האתחול נטען ומאתחל בתמונת השחזור כאשר רואים 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> | השתמש באנדרואיד 12 ואילך כדי לתמוך ב-ramdisks מהבהבים של ספקים. מקבל את כל גודל המחיצה ואת גודל הנתח. מקבל נתונים עבור כל נתח, ולאחר מכן מחבר את הנתונים ל- לפרטים, ראה |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | השתמש באנדרואיד 12 ואילך כדי לתמוך ב-ramdisks מהבהבים של ספקים. זוהי גרסה מיוחדת של פקודת הבזק. הוא מבצע פונקציית תמונת לפרטים, ראה |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | השתמש באנדרואיד 12 ואילך כדי לתמוך ב-ramdisks מהבהבים של ספקים. מביא את תמונת לפרטים, ראה |
Fastboot ומטען אתחול
טוען האתחול מבזיק את מחיצות bootloader
, radio
ומחיצות boot/recovery
, ולאחר מכן המכשיר מאתחל לתוך fastboot (מרחב משתמש) ומאיר את כל המחיצות האחרות. טוען האתחול אמור לתמוך בפקודות הבאות.
פקודה | תיאור |
---|---|
download | מוריד את התמונה להבהב. |
flash recovery <image> / flash boot <image> / flash bootloader <image> / | מהבהב מחיצת recovery/boot ומטען אתחול. |
reboot | מאתחל את המכשיר. |
reboot fastboot | מאתחל לאתחל מהיר. |
reboot recovery | מאתחל להתאוששות. |
getvar | מקבל משתנה מאתחול שנדרש להבהב של תמונת התאוששות/אתחול (לדוגמה, current-slot וגודל max-download-size ). |
oem <command> | פקודה שהוגדרה על ידי OEM. |
מחיצות דינמיות
אסור ל-bootloader לאפשר מהבהב או מחיקה של מחיצות דינמיות ועליו להחזיר שגיאה אם מנסים פעולות אלו. עבור התקני מחיצה דינמית שהותאמו לאחור, כלי האתחול המהיר (ומטען האתחול) תומך במצב כוח להבהב ישירות של מחיצה דינמית במצב של טוען אתחול. לדוגמה, אם system
היא מחיצה דינמית במכשיר שהותקן מחדש, שימוש בפקודת fastboot --force flash system
מאפשר למטען האתחול (במקום fastbootd
) להבהב את המחיצה.
טעינה במצב כבוי
אם מכשיר תומך בטעינה במצב כבוי או באתחול אוטומטי בדרך אחרת למצב מיוחד כאשר מתח מופעל, יישום של פקודת fastboot oem off-mode-charge 0
חייב לעקוף את המצבים המיוחדים הללו, כך שהמכשיר יופעל כאילו המשתמש לחץ כפתור ההפעלה.
Fastboot OEM HAL
כדי להחליף לחלוטין את ה-fastboot של טוען האתחול, fastboot חייב לטפל בכל פקודות fastboot הקיימות. רבות מהפקודות הללו הן מיצרני OEM והן מתועדות אך דורשות יישום מותאם אישית. הרבה פקודות ספציפיות ל-OEM אינן מתועדות. כדי לטפל בפקודות כאלה, ה-fastboot HAL מציין את פקודות ה-OEM הנדרשות. יצרני 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 בקרת האתחול ו-HAL בריאות ארוזים כחלק מתמונת השחזור.
הוסף כל הרשאות SEPolicy ספציפיות למכשיר הנדרשות על ידי
fastbootd
. לדוגמה,fastbootd
דורש גישת כתיבה למחיצה ספציפית למכשיר כדי להבהב את המחיצה הזו. בנוסף, יישום Fastboot HAL עשוי לדרוש גם הרשאות ספציפיות למכשיר.
כדי לאמת את fastboot של מרחב המשתמש, הפעל את ה- Vendor Test Suite (VTS) .
דיסקים מהבהבים של ספקים
אנדרואיד 12 ומעלה מספקת תמיכה ב-ramdisks מהבהבים עם פקודת fastboot נוספת שמושכת את תמונת vendor_boot
המלאה מהתקן. הפקודה מבקשת מכלי האתחול המהיר בצד המארח לקרוא את כותרת האתחול של הספק, תמונה מחדש ולהבהב את התמונה החדשה.
כדי למשוך את תמונת vendor_boot
המלאה, הפקודה fetch:vendor_boot
נוספה הן לפרוטוקול fastboot והן למימוש ה-fastbootd של הפרוטוקול באנדרואיד 12. שימו לב ש-fastbootd אכן מיישם זאת, אך ייתכן שמטען האתחול עצמו לא. יצרני OEM יכולים להוסיף את הפקודה fetch:vendor_boot
למימוש הפרוטוקול של טוען האתחול שלהם. עם זאת, אם הפקודה אינה מזוהה במצב טוען האתחול, אזי הבהוב של רדיסקים של ספקים בודדים במצב טוען אתחול אינה אפשרות הנתמכת על ידי ספק.
שינויים בטעינת האתחול
הפקודות getvar:max-fetch-size
ו- fetch:name
מיושמות ב- fastbootd
. כדי לתמוך ב-ramdisks מהבהבים של ספק ב-bootloader, עליך ליישם את שתי הפקודות הללו.
Fastbootd שינויים
getvar:max-fetch-size
דומה ל- max-download-size
. הוא מציין את הגודל המקסימלי שהמכשיר יכול לשלוח בתגובת DATA אחת. אסור לנהג להביא גודל גדול יותר מערך זה.
fetch:name[:offset[:size]]
מבצע סדרה של בדיקות במכשיר. אם כל הדברים הבאים נכונים, הפקודה fetch:name[:offset[:size]]
מחזירה נתונים:
- ההתקן פועל ב-build שניתן לאיתור באגים.
- המכשיר אינו נעול (מצב אתחול כתום).
- שם המחיצה שאוחזר הוא
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 של כותרת, הוא עושה את הפעולות הבאות:
- מחליף את ה-ramdisk של הספק בתמונה הנתונה.
- מהבהב את תמונת
vendor_boot
החדש.
- אם כותרת האתחול של הספק היא גרסה 4 , היא עושה את הפעולות הבאות:
- מחליף את כל ה-ramdisk של הספק בתמונה הנתונה כך שהתמונה הנתונה תהפוך למקטע ה-ramdisk של הספק היחיד בתמונת
vendor_boot
. - מחשב מחדש את הגודל והקיזוז בטבלת ramdisk של הספק.
- מהבהב את תמונת
vendor_boot
החדש.
- מחליף את כל ה-ramdisk של הספק בתמונה הנתונה כך שהתמונה הנתונה תהפוך למקטע ה-ramdisk של הספק היחיד בתמונת
- אם אתחול הספק הוא גרסה 3 של כותרת, הוא עושה את הפעולות הבאות:
fastboot flash vendor_boot:foo vendor-ramdisk.img
מביא את
vendor_boot image
, כאילו שנקראfastboot fetch
.- אם כותרת האתחול של הספק היא גרסה 3, היא מחזירה שגיאה.
אם כותרת האתחול של הספק היא גרסה 4, היא עושה את הפעולות הבאות:
- מוצא את קטע ramdisk של הספק עם השם
foo
. אם לא נמצא, או אם יש מספר התאמות, מחזיר שגיאה. - מחליף את קטע ramdisk של הספק בתמונה הנתונה.
- מחשב מחדש כל גודל וקיזוז בטבלת ramdisk של הספק.
- מהבהב את תמונת
vendor_boot
החדש.
- מוצא את קטע ramdisk של הספק עם השם
mkbootimg
default
של השם שמורה למתן שמות למקטעי ramdisk של הספק באנדרואיד 12 ואילך. בעוד שהסמנטיקה של fastboot flash vendor_boot:default
נשארת זהה, אסור לך לתת שם לשברי ramdisk שלך כברירת default
.
שינויים ב-SELinux
בוצע שינוי ב- fastbootd.te
כדי לתמוך ב-ramdisks מהבהבים של הספק.