ב-Android 12, התכונה bootconfig מחליפה את האפשרויות של androidboot.* kernel cmdline שנמצאות בשימוש ב-Android 11 ובגרסאות קודמות. התכונה bootconfig היא מנגנון להעברת פרטי הגדרה מה-build ומטוען האתחול אל Android 12.
התכונה הזו מספקת דרך להפריד בין פרמטרי ההגדרה של מרחב המשתמש ב-Android לבין פרמטרי ההגדרה של ליבת המערכת. העברת הפרמטרים הארוכים של ליבת androidboot.* לקובץ bootconfig מפנה מקום בשורת הפקודה של הליבה, והופכת אותו לזמין להרחבה עתידית.
גם הליבה וגם מרחב המשתמש של Android צריכים לתמוך ב-bootconfig.
- הגרסה הראשונה שכוללת את התמיכה הזו: Android 12
- גרסת הליבה הראשונה שכוללת את התמיכה הזו: ליבה 12-5.4.xx
הטמעת התכונה bootconfig במכשירים חדשים שמופעלים עם גרסת ליבה 12-5.10.xx. אין צורך להטמיע את התכונה הזו אם משדרגים את המכשירים.
דוגמאות ומקור
כשמעיינים בדוגמאות ובקוד המקור בקטע הזה, חשוב לשים לב שהפורמט של קוד bootconfig שונה רק במעט מהפורמט של שורת הפקודה של ליבת מערכת ההפעלה שמשמשת ב-Android 11 ובגרסאות קודמות.
עם זאת, חשוב להבין את ההבדל הבא:
- צריך להפריד בין הפרמטרים באמצעות רצף בריחה של שורה חדשה
\n, ולא באמצעות רווחים.
דוגמה לתוכנת אתחול
דוגמה לתוכנת אתחול מופיעה בהטמעה של תוכנת האתחול U-boot של Cuttlefish. שני קומיטים בהפניה מפורטים בהמשך. הראשון מעדכן את התמיכה בגרסת כותרת האתחול לגרסה העדכנית ביותר. בדוגמה, העדכון הראשון (או העדכון לגרסה חדשה יותר) של הקומיט הוא לגרסה הבאה, גרסה 4. הפקודה השנייה מבצעת שני דברים: היא מוסיפה טיפול ב-bootconfig ומדגימה הוספת פרמטרים בזמן ריצה:
דוגמה ל-build
דוגמה לבנייה שבה מוצגים שינויים ב-mkbootimg כדי לבנות את vendor_boot.img עם כותרת אתחול של ספק בגרסה 4 זמינה במאמר mkbootimg changes for
bootconfig.
כדי לבצע את הפעולות הבאות, צריך לעיין בשינויים ב-Cuttlefish:
- משתמשים בגרסה v4 של כותרת האתחול של הספק (או משדרגים אליה).
- מוסיפים bootconfig לשורת הפקודה של ליבת המערכת ומעבירים את הפרמטרים שנבחרו אל bootconfig.
הטמעה
השותפים צריכים להוסיף תמיכה לטועני האתחול שלהם ולהעביר את הפרמטרים של androidboot.* בזמן הבנייה מקובץ cmdline של ליבת המערכת לקובץ bootconfig. הדרך הכי טובה להטמיע את השינוי הזה היא לעשות זאת באופן הדרגתי. בקטע הטמעה ואימות הדרגתיים מוסבר איך לבצע את התהליך הזה.
אם יש לכם שינויים שמחפשים פרמטרים בקובץ /proc/cmdline, צריך להפנות אותם לקובץ /proc/bootconfig.androidboot.* הערכים של מאפייני ro.boot.*
מוגדרים עם הערכים החדשים של bootconfig, כך שלא צריך לבצע שינויים בקוד שמשתמש במאפיינים האלה.
שינויים ב-Build
קודם כול, מעלים את הגרסה של כותרת האתחול לגרסה 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
מוסיפים את הפרמטר bootconfig של שורת הפקודה של ליבת המערכת. כך נראה הגרעין שמחפש את הקטע bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
הפרמטרים של bootconfig נוצרים מהפרמטרים במשתנה BOARD_BOOTCONFIG, בדומה לאופן שבו נוצר kernel cmdline מ-BOARD\_KERNEL\_CMDLINE.
אפשר להעביר כל פרמטר androidboot.* כמו שהוא, באופן דומה לדוגמה הבאה:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
שינויים בתוכנת האתחול
טוען האתחול מגדיר את initramfs לפני שהוא עובר לליבת המערכת. ההגדרה של אתחול הליבה מחפשת את הקטע bootconfig, ומוודאת שהוא נמצא בסוף הקובץ initramfs, עם הטריילר הצפוי.
תוכנת האתחול מקבלת את vendor_boot.img פרטי הפריסה מכותרת קובץ אימג' לאתחול של הספק.
איור 1. הקצאת זיכרון ב-bootconfig ב-Android 12
טוען האתחול יוצר את הקטע bootconfig בזיכרון. הקטע bootconfig מכיל הקצאות זיכרון לפריטים הבאים:
- פרמטרים
- 4 B size
parameters size - 4 B size
parameters checksum - מחרוזת קסם של bootconfig 12 B (
#BOOTCONFIG\n)
הפרמטרים מגיעים משני מקורות: פרמטרים שידועים בזמן ה-build ופרמטרים שלא ידועים בזמן ה-build. צריך להוסיף פרמטרים לא ידועים.
פרמטרים שידועים במשך זמן של תהליך build נארזים בסוף vendor_bootהתמונה בקטע bootconfig. גודל הקטע מאוחסן (בבייטים) בשדה vendor_bootconfig_size בכותרת האתחול של הספק.
הפרמטרים שלא ידועים בזמן הבנייה ידועים רק בזמן הריצה בטוען האתחול. צריך להוסיף אותם לסוף הקטע של פרמטרים של bootconfig לפני שמחילים את הטריילר של bootconfig.
אם צריך להוסיף פרמטרים אחרי שמחילים את ה-trailer של bootconfig, צריך להחליף את ה-trailer ולהחיל אותו מחדש.
הטמעה ואימות מצטברים
כדי להטמיע את התכונה bootconfig באופן מצטבר, צריך לפעול לפי התהליך שמתואר בקטע הזה. אל תשנו את הפרמטרים של שורת הפקודה של ליבת המערכת בזמן שמוסיפים את הפרמטרים של bootconfig.
אלה השלבים להטמעה מצטברת, עם אימות:
- יוצרים את טוען האתחול ומבצעים שינויים ב-build, ואז מבצעים את הפעולות הבאות:
- משתמשים במשתנה
BOARD_BOOTCONFIGכדי להוסיף פרמטר חדש של bootconfig. - חשוב להשאיר את הפרמטרים של שורת הפקודה של ליבת המערכת כמו שהם, כדי שהמכשיר יוכל להמשיך לאתחל את עצמו בצורה תקינה. כך קל יותר לבצע ניפוי באגים ואימות.
- משתמשים במשתנה
- מאמתים את העבודה על ידי בדיקת התוכן של
/proc/bootconfig. מוודאים שהפרמטר החדש שנוסף מופיע אחרי שהמכשיר מופעל. - מעבירים את הפרמטרים
androidboot.*משורת הפקודה של ליבת המערכת אל bootconfig, באמצעות המשתנהBOARD_BOOTCONFIGוטוען האתחול. - מוודאים שכל אחד מהפרמטרים מופיע ב-
/proc/bootconfigושהם לא מופיעים ב-/proc/cmdline. אם אתם יכולים לאמת את זה, ההטמעה שלכם בוצעה בהצלחה.
שיקולים לגבי שדרוג ושדרוג לאחור של OTA
כשמנהלים שדרוגים או שדרוגים לאחור של OTA בין גרסאות שונות של Android או גרסאות שונות של ליבת מערכת ההפעלה, צריך לנקוט משנה זהירות.
Android 12 היא הגרסה הראשונה עם תמיכה ב-bootconfig. אם מבצעים שדרוג לאחור לגרסה קודמת, צריך להשתמש בפרמטרים של שורת הפקודה של ליבת המערכת במקום ב-bootconfig.
גרסאות הליבה 12-5.4 ואילך תומכות ב-bootconfig. אם מבצעים שדרוג לאחור לגרסה כלשהי שקודמת לגרסה הזו(כולל 11-5.4), צריך להשתמש בפרמטרים של שורת הפקודה של הליבה.
אפשר להמשיך להשתמש בפרמטרים של שורת הפקודה של ליבת המערכת בשדרוגים מ-Android 11 ומגרסאות קודמות ל-Android 12 ומגרסאות חדשות יותר. אותו עיקרון חל גם על שדרוג גרסאות הליבה.
פתרון בעיות
כשמבצעים את שלב האימות, אם הפרמטרים הצפויים לא מופיעים ב-/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.