Fastboot הוא שם של מודול ומצב של מנהל אתחול. בגרסאות Android 10 ואילך יש תמיכה במחיצות שניתן לשנות את הגודל שלהן, על ידי העברת ההטמעה של fastboot מ-bootloader למרחב המשתמש. ההעברה מאפשרת להעביר את הקוד להצתה למיקום משותף שניתן לתחזוקה ולבדיקה, שבו רק החלקים הספציפיים לספק של fastboot מוטמעים על ידי שכבת הפשטה של חומרה (HAL). בנוסף, ב-Android 12 ואילך יש תמיכה בעדכון של דיסקים של זיכרון RAM באמצעות פקודת fastboot נוספת.
איחוד של fastboot ו-recovery
מאחר ש-fastboot ומצב השחזור דומים במרחב המשתמש, אפשר למזג אותם למחיצה אחת או לקובץ בינארי אחד. כך אפשר ליהנות מיתרונות כמו שימוש בפחות מקום, פחות מחיצות באופן כללי ושיתוף הליבה והספריות של fastboot ושל recovery.
Fastbootd הוא שם של דימון ומצב במרחב המשתמש.
כדי לתמוך ב-fastbootd
, מנהל האתחול צריך להטמיע פקודה חדשה של boot-fastboot
לבקרת אתחול (BCB). כדי להיכנס למצב fastbootd
, מנהל האתחול כותב את הערך boot-fastboot
בשדה הפקודה של הודעת ה-BCB, בלי לשנות את השדה recovery
של ה-BCB (כדי לאפשר הפעלה מחדש של משימות שחזור שהופסק). גם השדות status
, stage
ו-reserved
לא ישתנו.
מנהל האתחול טוען את קובץ האימג' של התאוששות ומפעיל אותו ברגע שהוא רואה את הערך boot-fastboot
בשדה הפקודה של BCB. לאחר מכן, תהליך השחזור מנתח את הודעת ה-BCB ומעביר את המכשיר למצב fastbootd
.
פקודות ADB
בקטע הזה מתוארת הפקודה adb
לשילוב fastbootd
. הפקודה מקבלת תוצאות שונות, בהתאם לכך שהיא מופעלת על ידי המערכת או על ידי התהליך לשחזור.
הוראה | תיאור |
---|---|
reboot fastboot |
|
פקודות Fastboot
בקטע הזה מתוארות פקודות fastboot לשילוב fastbootd
, כולל פקודות חדשות להצגת פלאש ולניהול מחיצות לוגיות. לפקודות מסוימות יש תוצאות שונות, בהתאם לכך אם הן בוצעו על ידי bootloader או על ידי 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> |
שינוי הגודל של המחיצה הלוגי לגודל החדש בלי לשנות את התוכן שלה. הפונקציה נכשלת אם אין מספיק מקום פנוי לביצוע שינוי הגודל. |
flash <partition> [ <filename> ] |
כתיבת קובץ למחיצה ב-Flash. נעילת המכשיר צריכה להיות פתוחה. |
erase <partition> |
מחיקה של מחיצה (לא חייבת להיות מחיקה מאובטחת). המכשיר חייב להיות במצב פתוח. |
getvar <variable> | all |
הצגת משתנה של מנהל האתחול או כל המשתנים. אם המשתנה לא קיים, הפונקציה מחזירה שגיאה. |
set_active <slot> |
הגדרת בתמיכה ב-A/B, חריצי זיכרון הם קבוצות כפולות של מחיצות שאפשר להפעיל מהן בנפרד. השמות של התקציבים הם |
reboot |
הפעלה מחדש של המכשיר באופן רגיל. |
reboot-bootloader (או reboot bootloader ) |
הפעלה מחדש של המכשיר לתוכנת האתחול. |
fastboot fetch vendor_boot <out.img> |
משתמשים ב-Android מגרסה 12 ואילך כדי לתמוך באחסון RAM מהיר (ramdisk) של ספקים לצורך פלאש.
הפונקציה מקבלת את גודל המחיצה כולה ואת גודל הקטע. מקבלת נתונים לכל מקטע, ואז מחברת את הנתונים יחד ל-
פרטים נוספים זמינים במאמר |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
משתמשים ב-Android 12 ואילך כדי לתמוך ב-flashing של דיסקים של זיכרון RAM של ספקים. זוהי וריאנט מיוחד של פקודת ה-flash. הוא מבצע פונקציית אימג' של
פרטים נוספים זמינים במאמר |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
משתמשים ב-Android 12 ואילך כדי לתמוך ב-flashing של דיסקים של זיכרון RAM של ספקים. אחזור התמונה פרטים נוספים זמינים במאמר |
Fastboot ותוכנת האתחול
תוכנת האתחול מבצעת איפוס (flash) של המחיצות bootloader
, radio
ו-boot/recovery
, ולאחר מכן המכשיר מופעל במצב fastboot (מרחב המשתמש) ומתבצע איפוס של כל המחיצות האחרות. מנהל האתחול צריך לתמוך בפקודות הבאות.
הוראה | תיאור |
---|---|
download |
הורדת התמונה ל-Flash. |
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 (וה-bootloader) תומכים במצב כפייה כדי לבצע איפוס (flash) ישירות של מחיצה דינמית במצב bootloader. לדוגמה, אם system
הוא מחיצה דינמית במכשיר שעבר התאמה, שימוש בפקודה fastboot --force flash system
מאפשר למחולל האתחול (במקום fastbootd
) לבצע את הפלאש של המחיצה.
טעינה במצב כבוי
אם המכשיר תומך בטעינה במצב כבוי או מופעל באופן אוטומטי למצב מיוחד אחר כשמחברים אותו לחשמל, ההטמעה של הפקודה fastboot oem off-mode-charge 0
צריכה לעקוף את המצבים המיוחדים האלה, כדי שהמכשיר יופעל כאילו המשתמש לחץ על לחצן ההפעלה.
Fastboot OEM HAL
כדי להחליף לחלוטין את fastboot של מנהל האתחול, fastboot צריך לטפל בכל הפקודות הקיימות של fastboot. רבות מהפקודות האלה מגיעות מיצרני ציוד מקורי (OEM) ויש תיעוד עליהן, אבל הן דורשות הטמעה בהתאמה אישית. הרבה פקודות ספציפיות ליצרני ציוד מקורי לא מתועדות. כדי לטפל בפקודות כאלה, ה-HAL של fastboot מציין את פקודות ה-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
.חשוב לוודא ש-HAL של fastboot, HAL של בקרת האתחול ו-HAL של בריאות ארוזים כחלק מתמונת השחזור.
מוסיפים את כל ההרשאות הספציפיות למכשיר של SEPolicy שנדרשות ל-
fastbootd
. לדוגמה, כדי להפעיל את הפלאש של מחיצה ספציפית למכשיר, צריכה להיות ל-fastbootd
גישת כתיבה למחיצה הזו. בנוסף, הטמעת HAL של fastboot עשויה לדרוש גם הרשאות ספציפיות למכשיר.
כדי לאמת את fastboot במרחב המשתמש, מריצים את Vendor Test Suite (VTS).
דיסקים של זיכרון RAM מסוג Flash של ספקים
ב-Android 12 ואילך יש תמיכה ב-flashing של דיסקים של זיכרון RAM באמצעות פקודת fastboot נוספת שמושכת את קובץ האימג' המלא של vendor_boot
מהמכשיר. הפקודה מפעילה את הכלי fastboot בצד המארח כדי לקרוא את כותרת האתחול של הספק, ליצור קובץ אימג' מחדש ולהפעיל את האימג' החדש.
כדי לשלוף את קובץ האימג' המלא של vendor_boot
, הפקודה fetch:vendor_boot
נוספה גם לפרוטוקול fastboot וגם להטמעת הפרוטוקול ב-fastbootd ב-Android 12. שימו לב ש-fastbootd כן מטמיע את זה, אבל יכול להיות שה-bootloader עצמו לא מטמיע את זה. יצרני ציוד מקורי יכולים להוסיף את הפקודה fetch:vendor_boot
להטמעת הפרוטוקול של מערך האתחול. עם זאת, אם הפקודה לא מזוהה במצב bootloader, אי אפשר להשתמש באפשרות של פלאש של דיסקים ניידים של ספקים מסוימים במצב bootloader.
שינויים ב-Bootloader
הפקודות getvar:max-fetch-size
ו-fetch:name
מוטמעות ב-fastbootd
. כדי לתמוך בעדכון של דיסקים זמניים של ספקים ב-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
(או את שניהם), המערכת משתמשת בערכי ברירת המחדל: 0 עבור offset
ו-partition_size - offset
המחושב עבור size
.
- צוין קיזוז, לא צוין גודל:
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
זוהי וריאנט מיוחד של פקודת ה-flash. הוא מאחזר את התמונה
vendor_boot
, כאילו הופעלה הפונקציהfastboot fetch
.- אם ה-boot של הספק הוא גרסה 3, הוא מבצע את הפעולות הבאות:
- החלפת דיסק ה-RAM של הספק בתמונה שצוינה.
- איך מעדכנים את קובץ האימג' החדש של
vendor_boot
.
- אם כותרת האתחול של הספק היא גרסה 4, מתבצעים הפעולות הבאות:
- החלפת כל ה-ramdisk של הספק בתמונה הנתונה, כך שהתמונה הנתונה תהפוך לחלק היחיד של ה-ramdisk של הספק בתמונה
vendor_boot
. - מחשב מחדש את הגודל וההיסט בטבלת ה-ramdisk של הספק.
- איך מעדכנים את קובץ האימג' החדש של
vendor_boot
.
- החלפת כל ה-ramdisk של הספק בתמונה הנתונה, כך שהתמונה הנתונה תהפוך לחלק היחיד של ה-ramdisk של הספק בתמונה
- אם ה-boot של הספק הוא גרסה 3, הוא מבצע את הפעולות הבאות:
fastboot flash vendor_boot:foo vendor-ramdisk.img
אחזור של
vendor_boot image
, כאילו הופעלה הפונקציהfastboot fetch
.- אם כותרת האתחול של הספק היא בגרסה 3, היא מחזירה שגיאה.
אם כותרת האתחול של הספק היא בגרסה 4, היא מבצעת את הפעולות הבאות:
- מאתרים את קטע ה-ramdisk של הספק בשם
ramdisk_<var><foo></var>
. אם לא נמצאה התאמה, או אם יש כמה התאמות, הפונקציה מחזירה שגיאה. - החלפת קטע ה-ramdisk של הספק בתמונה שצוינה.
- חישוב מחדש של כל הגודל וההיסט בטבלת ה-ramdisk של הספק.
- איך מעדכנים את קובץ האימג' החדש של
vendor_boot
.
- מאתרים את קטע ה-ramdisk של הספק בשם
אם לא מציינים את <foo>, המערכת תנסה למצוא את
ramdisk_
.
mkbootimg
השם default
שמור למתן שמות לקטעי ramdisk של ספקים ב-Android 12 ואילך. הסמנטיקה של fastboot flash vendor_boot:default
לא השתנתה, אבל אסור לתת לשברים של ה-ramdisk את השם default
.
שינויים ב-SELinux
בוצע שינוי ב-fastbootd.te
כדי לתמוך ב-flashing של דיסקים של זיכרון RAM של ספקים.