העברת Fastboot ל-Userspace

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

אנדרואיד 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
  • מאתחל מחדש לתוך fastbootd (מערכת).
  • נכנס ישירות ל- fastbootd ללא אתחול מחדש (שחזור).

פקודות Fastboot

סעיף זה מתאר את פקודות fastboot לשילוב fastbootd , כולל פקודות חדשות להבהוב וניהול מחיצות לוגיות. לפקודות מסוימות יש תוצאות שונות, תלוי אם הן בוצעו על ידי טוען אתחול או על ידי fastbootd .

פקודה תיאור
reboot recovery
  • מאתחל מחדש לשחזור (מטען אתחול).
  • נכנס לשחזור ישירות ללא אתחול מחדש ( fastbootd ).
reboot fastboot מאתחל מחדש לתוך fastbootd .
getvar is-userspace
  • מחזירה yes ( fastbootd ).
  • מחזיר no (מטען אתחול).
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 active . בניסיון האתחול הבא, המערכת מאתחלת מהחריץ שצוין.

לתמיכה ב-A/B, חריצים הם קבוצות משוכפלות של מחיצות שניתן לאתחל מהן באופן עצמאי. משבצות נקראות a , b , וכן הלאה, ומובדלות על ידי הוספת הסיומות _a , _b וכן הלאה לשם המחיצה.

reboot מאתחל את המכשיר כרגיל.
reboot-bootloader (או reboot bootloader ) מאתחל את המכשיר לתוך טוען האתחול.
fastboot fetch vendor_boot <out.img>

השתמש באנדרואיד 12 ואילך כדי לתמוך ב- ramdisks מהבהבים של ספקים.

מקבל את כל גודל המחיצה ואת גודל הנתח. מקבל נתונים עבור כל נתח, ולאחר מכן מחבר את הנתונים ל- <out.img>

לפרטים, ראה fastboot fetch vendor_boot <out.img> .

fastboot flash vendor_boot:default <vendor-ramdisk.img>

השתמש באנדרואיד 12 ואילך כדי לתמוך ב-ramdisks מהבהבים של ספקים.

זוהי גרסה מיוחדת של פקודת הבזק. הוא מבצע פונקציית תמונת fetch vendor_boot , כאילו נקרא fastboot fetch מהיר. תמונת ה- vendor_boot החדשה שהיא מהבהבת תלויה אם גרסת כותרת האתחול היא גרסה 3 או גרסה 4.

לפרטים, ראה fastboot flash vendor_boot:default <vendor-ramdisk.img> .

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> השתמש באנדרואיד 12 ואילך כדי לתמוך ב-ramdisks מהבהבים של ספקים.

מביא את תמונת vendor_boot . מחזירה שגיאה אם ​​כותרת האתחול של הספק היא גרסה 3. אם זו גרסה 4, היא מוצאת את קטע ה-ramdisk של הספק הנכון (אם זמין). הוא מחליף את זה בתמונה הנתונה, מחשב מחדש גדלים וקיזוזים, ומהבהב את vendor_boot image החדשה.

לפרטים, ראה fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

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 במכשיר:

  1. הוסף fastbootd ל- PRODUCT_PACKAGES ב- device.mk : PRODUCT_PACKAGES += fastbootd .

  2. ודא שה-HAL של האתחול המהיר, HAL בקרת האתחול ו-HAL בריאות ארוזים כחלק מתמונת השחזור.

  3. הוסף כל הרשאות 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 החדש.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image , כאילו שנקרא fastboot fetch .

    • אם כותרת האתחול של הספק היא גרסה 3, היא מחזירה שגיאה.
    • אם כותרת האתחול של הספק היא גרסה 4, היא עושה את הפעולות הבאות:

      • מוצא את קטע ramdisk של הספק עם שם foo . אם לא נמצא, או אם יש מספר התאמות, מחזיר שגיאה.
      • מחליף את קטע ramdisk של הספק בתמונה הנתונה.
      • מחשב מחדש כל גודל וקיזוז בטבלת ramdisk של הספק.
      • מהבהב את תמונת vendor_boot החדש.

mkbootimg

default של השם שמורה למתן שמות למקטעי ramdisk של הספק באנדרואיד 12 ומעלה. בעוד שהסמנטיקה של fastboot flash vendor_boot:default נשארת זהה, אסור לך לתת שם לשברי ramdisk שלך default .

שינויים ב-SELinux

בוצע שינוי ב- fastbootd.te כדי לתמוך ב-ramdisks מהבהבים של הספק.