ב-Android 12, התכונה bootconfig מחליפה את האפשרויות של שורת הפקודה של הליבה androidboot.*
שבשימוש ב-Android 11 ובגרסאות קודמות. התכונה bootconfig היא מנגנון להעברת פרטי תצורה מה-build ומ-bootloader אל Android 12.
התכונה הזו מספקת דרך להפריד בין פרמטרים של הגדרות למרחב המשתמש של Android לבין פרמטרים של הגדרות לליבת Android. העברת הפרמטרים הארוכים של הליבה androidboot.*
לקובץ bootconfig יוצרת מקום בשורת הפקודה של הליבה ומאפשרת להרחיב אותה בעתיד.
גם הליבה וגם מרחב המשתמש של Android חייבים לתמוך ב-bootconfig
.
- הגרסה הראשונה עם התמיכה הזו: Android 12
- גרסת הליבה הראשונה עם התמיכה הזו: ליבה 12-5.4.xx
הטמעת התכונה bootconfig במכשירים חדשים שיושקו עם גרסה 12-5.10.xx של הליבה. אין צורך להטמיע אותו אם משדרגים מכשירים.
דוגמאות ומקור
כשבודקים את הדוגמאות ואת קוד המקור בקטע הזה, חשוב לזכור שהפורמט של הקוד bootconfig
שונה רק במעט מהפורמט של cmdline של הליבה שנעשה בו שימוש ב-Android 11 ובגרסאות ישנות יותר.
עם זאת, יש הבדל חשוב לשימוש שלכם:
- הפרמטרים צריכים להיות מופרדים באמצעות רצף הבריחה של שורה חדשה
\n
, ולא באמצעות רווחים.
דוגמה לתוכנת אתחול
דוגמה למחולל אתחול מופיעה בהטמעה של מנהל האתחול לדוגמה של Cuttlefish U-boot. שני השמירות ב-reference מפורטות בהמשך. העדכון הראשון מעדכן את התמיכה בגרסה של כותרת האתחול לגרסה האחרונה. בדוגמה, ההצהרה הראשונה מעדכנת את התמיכה בגרסה לגרסה הבאה, v4. הדוגמה השנייה מבצעת שני דברים: היא מוסיפה טיפול ב-bootconfig וממחישה הוספת פרמטרים בזמן הריצה:
דוגמה ל-build
דוגמה ל-build שמציגה את השינויים ב-mkbootimg
ליצירת vendor_boot.img
עם כותרת האתחול של הספק בגרסה 4 מופיעה במאמר mkbootimg changes for
bootconfig
.
כדאי לעיין בשינויים ב-Cuttlefish כדי לבצע את הפעולות הבאות:
- משתמשים בגרסה v4 של כותרת האתחול של הספק (או משדרגים אליה).
- מוסיפים את bootconfig ל-cmdline של הליבה ומעבירים את הפרמטרים שנבחרו ל-bootconfig.
הטמעה
השותפים צריכים להוסיף תמיכה למחוללי האתחול שלהם ולהעביר את הפרמטרים של androidboot.*
בזמן ה-build מ-cmdline של הליבה לקובץ bootconfig. הדרך הטובה ביותר להטמיע את השינוי הזה היא לעשות זאת באופן מצטבר. בקטע הטמעה ואימות מצטברים מוסבר איך פועלים לפי תהליך מצטבר.
אם יש שינויים שמחפשים את הפרמטרים androidboot.*
בקובץ /proc/cmdline, צריך להפנות אותם לקובץ /proc/bootconfig
במקום זאת. המאפיינים ro.boot.*
מוגדרים עם הערכים החדשים של bootconfig
, כך שאין צורך לבצע שינויים בקוד שמשתמש במאפיינים האלה.
שינויים בגרסה היציבה
קודם צריך לשדרג את גרסת הכותרת של האתחול לגרסה 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
מוסיפים את הפרמטר bootconfig
של שורת הפקודה של הליבה. כך הליבה מחפשת את הקטע bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
הפרמטרים של bootconfig נוצרים מהפרמטרים במשתנה BOARD_BOOTCONFIG
, בדומה ל-cmdline של הליבה שנוצר מ-BOARD\_KERNEL\_CMDLINE
.
אפשר להעביר כל פרמטר androidboot.*
כפי שהוא, בדומה לדוגמה הבאה:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
שינויים ב-Bootloader
מנהל האתחול מגדיר את initramfs
לפני שהוא קופץ לליבה. הגדרת האתחול של הליבה מחפשת את הקטע bootconfig, ומחפשת אותו ממש בסוף הקובץ initramfs,
עם הטריילר הצפוי.
bootloader מקבל את פרטי הפריסה של vendor_boot.img
מכותרת קובץ האימג' של אתחול הספק.
איור 1. הקצאת זיכרון ל-bootconfig ב-Android 12
מנהל האתחול יוצר את הקטע bootconfig בזיכרון. הקטע bootconfig מכיל הקצאות זיכרון לרכיבים הבאים:
- פרמטרים
- גודל 4 B
parameters size
- גודל 4 B
parameters checksum
- מחרוזת קסם של bootconfig באורך 12 B (
#BOOTCONFIG\n
)
הפרמטרים מגיעים משני מקורות: פרמטרים שידועים בזמן ה-build, ופרמטרים שלא ידועים בזמן ה-build. צריך להוסיף פרמטרים לא מוכרים.
פרמטרים שידועים בזמן ה-build נארזים בסוף קובץ האימג' vendor_boot
בקטע bootconfig. הגודל של הקטע מאוחסן (כבייטים) בשדה vendor_bootconfig_size
בכותרת האתחול של הספק.
הפרמטרים שלא ידועים בזמן ה-build ידועים רק בזמן הריצה ב-bootloader. צריך להוסיף אותם לסוף הקטע של פרמטרים של bootconfig לפני החלת ה-trailer של bootconfig.
אם צריך להוסיף פרמטרים אחרי החלת הטריילר של bootconfig, צריך לשכתב את הטריילר ולהחיל אותו מחדש.
הטמעה ואימות מצטברים
כדי להטמיע את התכונה bootconfig באופן מצטבר, פועלים לפי התהליך שמתואר בקטע הזה. לא משנים את הפרמטרים של שורת הפקודה של הליבה בזמן שמוסיפים את הפרמטרים של bootconfig.
אלה השלבים להטמעה מצטברת עם אימות:
- מבצעים את השינויים במרכז האתחול וב-build, ולאחר מכן מבצעים את הפעולות הבאות:
- משתמשים במשתנה
BOARD_BOOTCONFIG
כדי להוסיף פרמטר חדש של bootconfig. - שומרים את הפרמטרים של cmdline של הליבה כפי שהם, כדי שהמכשיר ימשיך להפעיל את האתחול בצורה תקינה. כך קל יותר לנפות באגים ולבצע אימות.
- משתמשים במשתנה
- מאמתים את העבודה על ידי בדיקת התוכן של
/proc/bootconfig
. מוודאים שהפרמטר החדש מופיע אחרי שהמכשיר מופעל. - להעביר את הפרמטרים
androidboot.*
מ-cmdline של הליבה אל bootconfig, באמצעות המשתנהBOARD_BOOTCONFIG
ואת bootloader. - מוודאים שכל אחד מהפרמטרים קיים ב-
/proc/bootconfig
ולא קיים ב-/proc/cmdline
. אם זה המצב, ההטמעה בוצעה בהצלחה.
שיקולים לגבי שדרוגים ושדרוגים לאחור באמצעות OTA
כשמנהלים שדרוגים וירידות גרסאות OTA בין גרסאות שונות של Android או גרסאות שונות של הליבה, צריך להיזהר במיוחד.
Android 12 היא הגרסה הראשונה עם תמיכה ב-bootconfig. אם רוצים לשדרג לאחור לגרסה כלשהי לפני כן, צריך להשתמש בפרמטרים של cmdline בליבה במקום ב-bootconfig.
גרסאות הליבה 12-5.4 ואילך תומכות ב-bootconfig. אם רוצים לשדרג לאחור לגרסה כלשהי לפני כן(כולל 11-5.4), צריך להשתמש בפרמטרים של cmdline בליבה.
בשדרוגים מ-Android 11 ומטה ל-Android 12 ואילך אפשר להמשיך להשתמש בפרמטרים של שורת הפקודה של הליבה. אותו הדבר חל על שדרוג גרסאות הליבה.
פתרון בעיות
כשמבצעים את השלב verify, אם הפרמטרים הצפויים לא מופיעים ב-/proc/bootconfig
, בודקים את יומני הליבה ב-logcat
. תמיד יש רשומה ביומן של bootconfig אם הליבה תומכת בכך.
דוגמה לפלט ביומן
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
אם יופיע יומן שגיאות, סימן שהיתה בעיה בטעינת bootconfig. כדי לראות סוגים שונים של שגיאות, אפשר לעיין בקובץ init/main.c.