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

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

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

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

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

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

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

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

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

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

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

דוגמה ל-Build

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

הטמעה

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

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

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

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

מוסיפים את פרמטר הליבה cmdline של 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

שינויים בתוכנת האתחול

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

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

תרשים של פריסת הקצאת הזיכרון מסוג אתחול

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

פתרון בעיות

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

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

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

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