Fastboot הוא השם של מודול ומצב של תוכנת אתחול. Android 10 ואילך תומך במחיצות שניתן לשנות את הגודל שלהן על ידי העברת ההטמעה של fastboot מ-bootloader אל userspace. המיקום החדש מאפשר להעביר את הקוד המהבהב למיקום משותף שניתן לתחזוקה ולבדיקה, כאשר רק החלקים הספציפיים לספק של fastboot מיושמים על ידי שכבת הפשטה של חומרה (HAL). בנוסף, Android מגרסה 12 ואילך תומך בהעברת ramdisk באמצעות פקודת fastboot נוספת.
איחוד של כלי לאתחול מהיר (fastboot) ושחזור
מכיוון ש-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 ואילך כדי לתמוך בהפעלת vendor ramdisks.
מקבל את הגודל של המחיצה כולה ואת גודל החלק. מקבל נתונים לכל קבוצת נתונים,
ואז מחבר את הנתונים יחד כדי
פרטים נוספים זמינים במאמר |
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) מפעילה את המחיצות 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. |
מחיצות דינמיות
טוען האתחול לא יכול לאפשר את ההפעלה או המחיקה של מחיצות דינמיות, וחייב להחזיר שגיאה אם מנסים לבצע את הפעולות האלה. במכשירים עם מחיצות דינמיות שהותאמו מחדש, כלי האתחול המהיר (ומנהל האתחול) תומך במצב כפייה להצגת מחיצה דינמית ישירות בזמן שמנהל האתחול פועל. לדוגמה, אם system היא מחיצה דינמית במכשיר שעבר התאמה, השימוש בפקודה fastboot --force flash system מאפשר לטוען האתחול (במקום fastbootd) להפעיל את המחיצה.
טעינה במצב כבוי
אם מכשיר תומך בטעינה במצב כבוי או באתחול אוטומטי למצב מיוחד כשמפעילים אותו, הטמעה של הפקודה fastboot oem off-mode-charge 0 חייבת לעקוף את המצבים המיוחדים האלה, כך שהמכשיר יופעל כאילו המשתמש לחץ על לחצן ההפעלה.
שכבת הפשטת חומרה (HAL) של יצרן ציוד מקורי (OEM) לאתחול מהיר (fastboot)
כדי להחליף לחלוטין את 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.חשוב לוודא ש-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, אז הפעלת vendor ramdisks בודדים במצב bootloader היא לא אפשרות שנתמכת על ידי הספק.
שינויים בתוכנת האתחול
הפקודות getvar:max-fetch-size ו-fetch:name מיושמות ב-fastbootd. כדי לתמוך בהצגת ramdisk של ספק בהפעלה של 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- הפונקציה 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 של ספקים.