Fastboot הוא השם של מודול ומצב של טוען אתחול. ב-Android מגרסה 10 ואילך, אפשר לשנות את הגודל של המחיצות על ידי העברה של ההטמעה של fastboot מ-bootloader אל userspace. המיקום מחדש הזה מאפשר להעביר את הקוד להבהוב למיקום משותף שניתן לתחזוקה ולבדיקה, כאשר רק החלקים הספציפיים לספק של fastboot מיושמים על ידי שכבת הפשטה של חומרה (HAL). בנוסף, Android מגרסה 12 ואילך תומך בהצפנת ramdisk באמצעות פקודת fastboot נוספת.
איחוד של fastboot ו-recovery
מכיוון ש-fastboot ו-recovery במרחב המשתמש דומים, אפשר למזג אותם למחיצה או לקובץ בינארי אחד. היתרונות של זה הם, למשל, שימוש בפחות נפח אחסון, פחות מחיצות באופן כללי ושיתוף של הליבה והספריות בין fastboot לבין recovery.
Fastbootd הוא השם של דמון ומצב במרחב המשתמש.
כדי לתמוך ב-fastbootd
, טוען האתחול צריך להטמיע פקודה חדשה של בלוק בקרת אתחול (BCB) מסוג boot-fastboot
. כדי להיכנס למצב fastbootd
, טוען האתחול כותב boot-fastboot
בשדה הפקודה של הודעת ה-BCB ומשאיר את השדה recovery
של ה-BCB ללא שינוי (כדי לאפשר הפעלה מחדש של משימות שחזור שהופסקו). גם השדות status
, stage
ו-reserved
לא ישתנו.
טוען את ה-bootloader ומפעיל את תמונת השחזור כשהוא רואה 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> ] |
כותב קובץ למחיצת פלאש. המכשיר צריך להיות במצב לא נעול. |
erase <partition> |
מחיקה של מחיצה (לא נדרשת מחיקה מאובטחת). המכשיר צריך להיות במצב לא נעול. |
getvar <variable> | all |
הפקודה מציגה משתנה של bootloader או את כל המשתנים. אם המשתנה לא קיים, הפונקציה מחזירה שגיאה. |
set_active <slot> |
מגדיר את משבצת האתחול של בדיקת ה-A/B שצוינה כ- כדי לתמוך ב-A/B, המשבצות הן קבוצות כפולות של מחיצות שאפשר להפעיל מהן בנפרד. המשבצות נקראות |
reboot |
המכשיר יופעל מחדש כרגיל. |
reboot-bootloader (או reboot bootloader ) |
המכשיר מופעל מחדש לתוכנת האתחול. |
fastboot fetch vendor_boot <out.img> |
אפשר להשתמש ב-Android מגרסה 12 ואילך כדי לתמוך בהפעלת ramdisk של ספק.
הפונקציה מחזירה את הגודל של המחיצה כולה ואת גודל החלק. מקבל נתונים לכל קבוצת נתונים,
ואז מחבר את הנתונים כדי
פרטים נוספים זמינים במאמר |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
אפשר להשתמש בו ב-Android מגרסה 12 ואילך כדי לתמוך בהצגת ramdisk של ספק. זוהי גרסה מיוחדת של פקודת ה-flash. היא מבצעת פונקציית תמונה
פרטים נוספים זמינים במאמר |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
אפשר להשתמש ב-Android מגרסה 12 ואילך כדי לתמוך בהעברת ramdisk של ספק. מאחזר את התמונה פרטים נוספים מופיעים במאמר |
כלי לאתחול מהיר (fastboot) ותוכנת אתחול
תוכנת האתחול מפעילה את המחיצות 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. |
מחיצות דינמיות
טוען האתחול אסור לאפשר את ההפעלה או המחיקה של מחיצות דינמיות, וחייב להחזיר שגיאה אם מנסים לבצע את הפעולות האלה. במכשירים עם מחיצות דינמיות שנוספו להם בדיעבד, כלי האתחול המהיר (ו-bootloader) תומך במצב כפייה להעברת מחיצה דינמית ישירות בזמן שהמכשיר במצב bootloader. לדוגמה, אם system
היא מחיצה דינמית במכשיר שעבר התאמה, השימוש בפקודה fastboot --force flash system
מאפשר לטוען האתחול (במקום fastbootd
) להפעיל את המחיצה.
טעינה במצב כבוי
אם מכשיר תומך בטעינה במצב כבוי או באתחול אוטומטי למצב מיוחד כשמפעילים אותו, הטמעה של הפקודה fastboot oem off-mode-charge 0
צריכה לעקוף את המצבים המיוחדים האלה, כך שהמכשיר יופעל כאילו המשתמש לחץ על לחצן ההפעלה.
Fastboot OEM HAL
כדי להחליף לחלוטין את fastboot של bootloader, 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
.חשוב לוודא ש-fastboot HAL, boot control HAL ו-health HAL נארזים כחלק מתמונת השחזור.
מוסיפים את כל ההרשאות הספציפיות למכשיר ב-SEPolicy שנדרשות על ידי
fastbootd
. לדוגמה,fastbootd
דורש גישת כתיבה למחיצה ספציפית למכשיר כדי להפעיל את המחיצה. בנוסף, יכול להיות שיישום של fastboot HAL ידרוש גם הרשאות ספציפיות למכשיר.
כדי לאמת את ה-fastboot במרחב המשתמש, מריצים את חבילת בדיקות הספק (VTS).
דיסקים וירטואליים של ספקי פלאש
ב-Android בגרסה 12 ואילך יש תמיכה בהצגת ramdisk באמצעות פקודת fastboot נוספת שמחלצת את תמונת vendor_boot
המלאה ממכשיר. הפקודה גורמת לכלי fastboot בצד המארח לקרוא את כותרת האתחול של הספק, ליצור מחדש את התמונה ולהעביר את התמונה החדשה.
כדי לשלוף את התמונה המלאה vendor_boot
, הפקודה fetch:vendor_boot
נוספה לפרוטוקול fastboot וליישום fastbootd של הפרוטוקול ב-Android 12. שימו לב: fastbootd מיישם את הפקודה הזו, אבל יכול להיות שמטען האתחול עצמו לא מיישם אותה. יצרני ציוד מקורי יכולים להוסיף את הפקודה fetch:vendor_boot
להטמעה של פרוטוקול טוען האתחול. עם זאת, אם הפקודה לא מזוהה במצב bootloader, אז הפעלת ramdisk של ספק מסוים במצב bootloader היא לא אפשרות שנתמכת על ידי הספק.
שינויים בתוכנת האתחול
הפקודות getvar:max-fetch-size
ו-fetch:name
מיושמות ב-fastbootd
. כדי לתמוך בהצגת ramdisk של ספק בטוען האתחול, צריך להטמיע את שתי הפקודות האלה.
שינויים ב-Fastbootd
הפונקציה getvar:max-fetch-size
דומה לפונקציה max-download-size
. ההגדרה הזו מציינת את הגודל המקסימלי שהמכשיר יכול לשלוח בתגובת DATA אחת. הדרייבר לא יכול לאחזר גודל שגדול מהערך הזה.
fetch:name[:offset[:size]]
מבצע סדרה של בדיקות במכשיר. אם כל התנאים הבאים מתקיימים, הפקודה fetch:name[:offset[:size]]
מחזירה נתונים:
- במכשיר פועל build שאפשר לבצע בו ניפוי באגים.
- המכשיר לא נעול (מצב ההפעלה כתום).
- השם של המחיצה שאוחזרה הוא
vendor_boot
. - הערך של
size
הוא בין 0 ל-max-fetch-size
, כולל.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
- הפונקציה Calls
getvar max-fetch-size
קובעת את גודל החלק. - קריאות
getvar partition-size:vendor_boot[_a]
כדי לקבוע את הגודל של המחיצה כולה. - שיחות
fastboot fetch vendor_boot[_a]:offset:size
לכל חלק. (גודל המקטע גדול יותר מהגודלvendor_boot
, לכן בדרך כלל יש רק מקטע אחד). - הוא מחבר את הנתונים ל-
out.img
.
- הפונקציה Calls
fastboot flash vendor_boot:default vendor-ramdisk.img
זוהי גרסה מיוחדת של פקודת ה-flash. הוא מאחזר את התמונה
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 של הספק עם השם
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
כדי לתמוך בהצגת ramdisk של ספקים.