הטמעה של robotsconfig ב-Android 12

ב-Android 12, התכונה bootconfig מחליפה את האפשרויות של שורת הפקודה של הליבה androidboot.* שבשימוש ב-Android 11 ובגרסאות קודמות. התכונה runconfig היא מנגנון להעברת הגדרות אישיות פרטים מגרסת ה-build ותוכנת האתחול ל-Android 12.

התכונה הזו מספקת דרך להפריד בין פרמטרים של הגדרות למרחב המשתמש של Android לבין פרמטרים של הגדרות לליבת Android. העברת הליבה הארוכה של androidboot.* ל-bootconfig יוצר מקום ב-cmdline הליבה ויוצר הוא זמין בהרחבה בעתיד.

גם הליבה וגם מרחב המשתמש ב-Android חייבים לתמוך ב-bootconfig.

  • הגרסה הראשונה עם התמיכה הזו: Android 12
  • גרסת הליבה הראשונה עם התמיכה הזו: ליבה 12-5.4.xx

הטמעת התכונה bootconfig במכשירים חדשים שיושקו עם גרסה 12-5.10.xx של הליבה. אין צורך להטמיע אותו אם משדרגים מכשירים.

דוגמאות ומקור

כשבודקים את הדוגמאות ואת קוד המקור בקטע הזה, חשוב לזכור שהפורמט של הקוד bootconfig שונה רק במעט מהפורמט של cmdline של הליבה שנעשה בו שימוש ב-Android 11 ובגרסאות ישנות יותר. עם זאת, יש הבדל חשוב לשימוש שלכם:

  • הפרמטרים חייבים להיות מופרדים באמצעות רצף הבריחה (escape) בשורה חדשה \n, ולא באמצעות מרחבים משותפים.

דוגמה לתוכנת אתחול

דוגמה למחולל אתחול מופיעה בהטמעה של מנהל האתחול לדוגמה של Cuttlefish U-boot. שני השמירות ב-reference מפורטות בהמשך. העדכון הראשון מעדכן את התמיכה בגרסה של כותרת האתחול לגרסה האחרונה. בדוגמה, ההצהרה הראשונה מעדכנת את תמיכת הגרסה לגרסה הבאה, v4. הדוגמה השנייה מבצעת שני דברים: היא מוסיפה טיפול ב-bootconfig וממחישה הוספת פרמטרים בזמן הריצה:

דוגמה ל-Build

לדוגמה של build שמציג את השינויים ב-mkbootimg כדי ליצור את vendor_boot.img עם כותרת אתחול של הספק גרסה 4, מידע נוסף זמין בכתובת mkbootimg changes for bootconfig. הצג את השינויים בדיונון כדי לבצע את הפעולות הבאות:

הטמעה

השותפים צריכים להוסיף תמיכה לתוכנת האתחול ולהעביר את זמן ה-build שלהם הפרמטרים של androidboot.* מהליבה (kernel) של cmdline אל ה-אתחול (אתחול) חדש. הדרך הטובה ביותר ליישם את השינוי הזה היא לעשות את זה באופן מצטבר; לראות את הקטע הטמעה ואימות מצטברים לקבלת מידע על מעקב אחרי תהליך מצטבר.

אם יש שינויים שמחפשים את הפרמטרים androidboot.* בקובץ /proc/cmdline, צריך להפנות אותם לקובץ /proc/bootconfig במקום זאת. ro.boot.* מוגדרים עם ערכי bootconfig החדשים, כך שאין צורך בקוד שמשתמש במאפיינים האלה.

יצירת שינויים

קודם כול, משדרגים את גרסת כותרת ההפעלה לגרסה 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

מוסיפים את הפרמטר bootconfig ל-cmdline של הליבה. זה גורם לליבה (kernel) לחפש קטע האתחול:

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 לפני המעבר לליבה. הליבה (kernel) הגדרת ההפעלה מחפש את הקטעbootconfig, ומחפש אותו להיות initramfs, עם הטריילר הצפוי.

bootloader מקבל את פרטי הפריסה של vendor_boot.img מהכותרת של קובץ האימג' של אתחול הספק.

תרשים של הפריסה של הקצאת הזיכרון ב-bootconfig

איור 1. הקצאת זיכרון עם תצורת אתחול ב-Android 12

מנהל האתחול יוצר את הקטע bootconfig בזיכרון. הקטע runconfig מכיל הקצאות זיכרון לדברים הבאים:

  • פרמטרים
  • גודל 4 B parameters size
  • גודל 4 B parameters checksum
  • מחרוזת קסם של bootconfig באורך 12 B (#BOOTCONFIG\n)

הפרמטרים מגיעים משני מקורות: פרמטרים שידועים בזמן ה-build, ו פרמטרים שלא ידועים בזמן ה-build. צריך להוסיף פרמטרים לא מוכרים.

פרמטרים שידועים בזמן ה-build נארזים בסוף קובץ האימג' vendor_boot בקטע bootconfig. גודל הקטע מאוחסן (כבייטים) בשדה כותרת האתחול של הספק vendor_bootconfig_size.

הפרמטרים שלא ידועים בזמן ה-build ידועים רק בזמן הריצה תוכנת אתחול. צריך להוסיף אותם לסוף הקטע של פרמטרים של bootconfig לפני החלת ה-trailer של bootconfig.

אם צריך להוסיף פרמטרים אחרי החלת הטריילר של bootconfig, צריך לשכתב את הטריילר ולהחיל אותו מחדש.

הטמעה ואימות מצטברים

כדי להטמיע את התכונה bootconfig באופן מצטבר, פועלים לפי התהליך שמתואר בקטע הזה. משאירים את הפרמטרים של cmdline הליבה ללא שינוי בזמן נוספו פרמטרים bootconfig.

אלה השלבים להטמעה מצטברת עם אימות:

  1. מבצעים את השינויים במרכז האתחול וב-build, ולאחר מכן מבצעים את הפעולות הבאות:
    1. שימוש במשתנה BOARD_BOOTCONFIG כדי להוסיף הגדרת אתחול חדשה הפרמטר.
    2. שומרים את הפרמטרים של cmdline של הליבה כפי שהם, כדי שהמכשיר ימשיך להפעיל את האתחול בצורה תקינה. כך ניתן לבצע הרבה ניפוי באגים ואימות יותר קל.
  2. מאמתים את העבודה על ידי בדיקת התוכן של /proc/bootconfig. מוודאים שהפרמטר החדש מופיע אחרי שהמכשיר מופעל.
  3. להעביר את הפרמטרים androidboot.* מ-cmdline של הליבה אל bootconfig, באמצעות המשתנה BOARD_BOOTCONFIG ואת bootloader.
  4. מוודאים שכל אחד מהפרמטרים קיים ב-/proc/bootconfig ושהם לא נמצאים ב-/proc/cmdline. אם ניתן לאמת זאת, ההטמעה הפעולה בוצעה בהצלחה.

שיקולים לשדרוג ולשדרוג לאחור של OTA

כשמנהלים שדרוגים וירידות גרסאות OTA בין גרסאות שונות של Android או גרסאות שונות של הליבה, צריך להיזהר במיוחד.

Android 12 היא הגרסה הראשונה עם תמיכה ב-bootconfig. במקרה שמשדרגים לאחור לגרסה כלשהי לפני כן, פרמטרים של cmdline בליבה (kernel) במקום אתחול התצורה.

גרסאות הליבה 12-5.4 ואילך תומכות ב-bootconfig. אם רוצים לשדרג לאחור לגרסה כלשהי לפני כן (כולל 11-5.4), צריך להשתמש בפרמטרים של cmdline של הליבה.

אם שדרוגים מ-Android 11 ומטה ל-Android 12 ואילך, יכול להיות שהם ימשיכו להשתמש פרמטרים של ליבה (kernel) של cmdline. אותו הדבר חל על שדרוג גרסאות הליבה.

פתרון בעיות

אם לא מופיעים הפרמטרים הצפויים: מבצעים את שלב האימות ב-/proc/bootconfig, צריך לבדוק את יומני הליבה ב-logcat. תמיד יש יומן קיימת עבורbootconfig אם הליבה (kernel) תומכת בה.

דוגמה לפלט יומן

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

אם מופיע יומן שגיאות, סימן שהייתה בעיה בטעינת אתחול. כדי לראות סוגים שונים של שגיאות, אפשר לעיין בקובץ init/main.c.