הטמעת Bootconfig באנדרואיד 12

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

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

גם הקרנל וגם מרחב המשתמש של אנדרואיד חייבים לתמוך bootconfig .

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

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

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

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

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

דוגמה לטעינת אתחול

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

דוגמה לבנות

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

יישום

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

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

בנה שינויים

ראשית, העלה את גרסת כותרת האתחול שלך לגרסה 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

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

BOARD_KERNEL_CMDLINE += bootconfig

הפרמטרים של bootconfig נוצרים מהפרמטרים במשתנה BOARD_BOOTCONFIG , בדומה ל-cmdline של הליבה שנוצרת מ- BOARD\_KERNEL\_CMDLINE .

ניתן להעביר כל פרמטר androidboot.* כפי שהוא, בדומה לפרמטרים הבאים:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

שינויים במטען האתחול

טוען האתחול מגדיר את initramfs לפני שהוא קופץ לקרנל. תצורת האתחול של הליבה מחפשת את קטע bootconfig, ומחפשת שהוא יהיה ממש בסוף של initramfs, עם הטריילר הצפוי.

טוען האתחול מקבל את פרטי הפריסה vendor_boot.img מכותרת תמונת האתחול של הספק.

Diagram of bootconfig memory allocation layout

איור 1. הקצאת זיכרון Bootconfig של Android 12

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

  • פרמטרים
  • 4 parameters size
  • 4 parameters checksum
  • מחרוזת קסם 12 B bootconfig ( #BOOTCONFIG\n )

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

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

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

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

יישום ותיקוף מצטבר

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

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

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

שיקולי שדרוג ושדרוג של OTA

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

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

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

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

פתרון תקלות

כאשר אתה מבצע את שלב האימות , אם אינך רואה את הפרמטרים הצפויים ב- /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 .