ב-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
שונה רק במעט מהפורמט של ליבה (kernel) שבה נעשה שימוש ב-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
מוסיפים את פרמטר הליבה cmdline של bootconfig
. כך הליבה מחפשת את הקטע bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
הפרמטרים runconfig נוצרים מהפרמטרים של המשתנה BOARD_BOOTCONFIG
, בדומה ל-kernel cmdline שנוצרת מ-BOARD\_KERNEL\_CMDLINE
.
אפשר להעביר כל פרמטר androidboot.*
כפי שהוא, בדומה לדוגמה הבאה:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
שינויים ב-Bootloader
מנהל האתחול מגדיר את initramfs
לפני שהוא קופץ לליבה. תצורת אתחול הליבה מחפשת את הקטעbooconfig, ומחפשת אותו בסוף initramfs,
עם הטריילר הצפוי.
תוכנת האתחול מקבלת את פרטי הפריסה vendor_boot.img
מכותרת תמונת ההפעלה של הספק.
איור 1. הקצאת זיכרון עם תצורת אתחול ב-Android 12
תוכנת האתחול יוצרת את הקטע אתחול תצורה בזיכרון. הקטע bootconfig מכיל הקצאות זיכרון לרכיבים הבאים:
- פרמטרים
- גודל 4 B
parameters size
- גודל 4 B
parameters checksum
- מחרוזת קסם של אתחול אתחול 12 B (
#BOOTCONFIG\n
)
הפרמטרים מגיעים משני מקורות: פרמטרים שידועים בזמן ה-build, ופרמטרים שלא ידועים בזמן ה-build. צריך להוסיף פרמטרים לא מוכרים.
פרמטרים שידועים בזמן ה-build נארזים בסוף קובץ האימג' vendor_boot
בקטע bootconfig. גודל המקטע מאוחסן (כבייטים) בשדה כותרת האתחול של הספק vendor_bootconfig_size
.
הפרמטרים שלא ידועים בזמן ה-build ידועים רק בזמן הריצה ב-bootloader. צריך להוסיף את הפרמטרים האלה בסוף הקטע 'פרמטרים של אתחול' לפני החלת הטריילר של אתחול קובץ ה-אתחול.
אם צריך להוסיף פרמטרים אחרי החלת הטריילר של bootconfig, צריך לשכתב את הטריילר ולהחיל אותו מחדש.
הטמעה ואימות מצטברים
כדי להטמיע את התכונה bootconfig באופן מצטבר, פועלים לפי התהליך שמתואר בקטע הזה. משאירים את הפרמטרים של cmdline הליבה ללא שינוי בזמן שמוסיפים את הפרמטרים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), חובה להשתמש בפרמטרים של ליבה (kernel) של cmdline.
גם אם שדרוגים מ-Android 11 ומטה ל-Android 12 ואילך, יכול להיות שהם ימשיכו להשתמש בפרמטרים של cmdline ליבה (kernel). אותו הדבר חל על שדרוג גרסאות הליבה.
פתרון בעיות
כשמבצעים את השלב 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.