קובצי אימג' לשחזור

במכשירים שאינם A/B, תמונת השחזור צריכה להכיל מידע מבלוב של עץ המכשיר (DTB) או מתמונת שכבת-על של ממשק מתקדם להגדרות ולניהול צריכת חשמל (ACPI). כשמכשירים כאלה מופעלים במצב שחזור, טוען האתחול יכול לטעון את תמונת שכבת העל שתואמת לתמונת השחזור. במכשירים שתומכים בעדכוני A/B (עדכונים חלקים), צריך להשתמש בשחזור כאתחול במקום במחיצת שחזור נפרדת (פרטים נוספים זמינים במאמר בנושא הטמעה של עדכוני A/B).

האפשרויות לכלול DTBO/ACPIO לשחזור כחלק מתמונת האתחול/השחזור משתנות בין גרסאות Android.

פריט תוכן עדכון הסכמה תאימות ל-GKI גרסת כותרת האתחול (מכשירים בהשקה) גרסת כותרת האתחול (שדרוג מכשירים) נדרשת תמונה ייעודית לשחזור
11 A/B,
Virtual A/B
כן ‫3* לא רלוונטי לא
A/B,
Virtual A/B
לא 2, 3 0, 1, 2, 3 לא
non-A/B כן 3 לא רלוונטי כן
non-A/B לא 2, 3 0, 1, 2, 3 כן
‫10 (Q) A/B לא רלוונטי 2 ‫0, 1, 2 לא
non-A/B לא רלוונטי 2 ‫0, 1, 2 כן
‫9 (P) A/B לא רלוונטי 1 ‫0, 1 לא
non-A/B לא רלוונטי 1 ‫0, 1 כן
‫8 (O) A/B לא רלוונטי לא רלוונטי (נחשב כ-0) לא רלוונטי (נחשב כ-0) לא
non-A/B לא רלוונטי לא רלוונטי (נחשב כ-0) לא רלוונטי (נחשב כ-0) כן

* במכשירי A/B עם Android בגרסה 11 ומעלה שמשתמשים ב-Generic Kernel Image ‏(GKI), צריך להשתמש בגרסה 3 של כותרת האתחול כדי שהמכשיר יהיה תואם למחיצת האתחול של הספק.

נקודות עיקריות:

  • במכשירים עם חלוקה למחיצות A/B אין צורך לציין תמונת שחזור, כי עדכוני A/B משתמשים בשני סטים של מחיצות (כולל boot ו-dtbo) ועוברים ביניהם במהלך העדכונים, כך שאין צורך בתמונת שחזור. במכשירי A/B עדיין אפשר להשתמש בתמונת שחזור ייעודית.

  • במכשירים שהושקו עם Android מגרסה 11 ואילך, שלא תומכים בחלוקה למחיצות A/B ומשתמשים בגרסה 3 של כותרת האתחול, צריך לציין במפורש גרסה 2 של כותרת האתחול לתמונת השחזור בנפרד. לדוגמה:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • בארכיטקטורות שלא תומכות בעצי מכשירים, תמונת השחזור יכולה לכלול תמונת ACPIO במקום תמונת DTBO.

מידע על כשלים ב-OTA ותמונות שחזור

כדי למנוע כשלים בעדכונים דרך האוויר (OTA) במכשירים שאינם A/B, תמונת השחזור צריכה להיות עצמאית ולא תלויה בתמונות אחרות. במהלך עדכון OTA, אם מתרחשת בעיה אחרי שקובץ האימג' של שכבת העל עודכן (אבל לפני השלמת העדכון המלא), המכשיר מנסה לבצע אתחול למצב שחזור כדי להשלים את עדכון ה-OTA. עם זאת, יכול להיות שיהיה חוסר התאמה בין מחיצת שכבת העל (שכבר עודכנה) לבין תמונת השחזור (שעדיין לא עודכנה).

כדי למנוע מצב שבו השחזור תלוי במחיצת DTBO/ACPIO במהלך עדכון, במכשירים שאינם A/B עם Android מגרסה 9 ואילך אפשר לציין תמונת DTBO/ACPIO לשחזור שמכילה מידע מתמונת השכבה העליונה כקטע נפרד בפורמט תמונת האתחול (חובה להשתמש בגרסה 1 או 2 של כותרת האתחול).

שינויים בקובץ האימג' לאתחול

כדי לאפשר לקובץ האימג' של השחזור להכיל את ה-DTBO או ה-ACPIO של השחזור במכשירים שאינם A/B עם Android מגרסה 9 ואילך, צריך לעדכן את מבנה קובץ האימג' של האתחול באופן הבא.

הקטע 'קובץ אימג' לאתחול' מספר הדפים
כותרת אתחול (דף אחד) 1
Kernel (l pages) ‫l = (kernel_size + page_size – 1) / page_size
Ramdisk (m pages) m = (ramdisk_size + page_size - 1) / page_size
תוכנת אתחול שלב שני (n דפים) ‫n = (second_size + page_size – 1) / page_size
Recovery DTBO או ACPIO (o pages) o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

פרטים על ארגומנטים של הכלי mkbootimg לציון נתיבי תמונת השכבה ותמונת הכותרת של תמונת האתחול זמינים במאמר Boot Image Header Versioning (ניהול גרסאות של כותרת תמונת האתחול).

הטמעה של DTBO

במכשירים שאינם A/B עם Android מגרסה 9 ואילך, אפשר לאכלס את הקטע recovery_dtbo של תמונת השחזור. כדי לכלול את התמונה recovery_dtbo ב-recovery.img, במכשיר BoardConfig.mk:

  • מגדירים את ההגדרה BOARD_INCLUDE_RECOVERY_DTBO לערך true:

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • מרחיבים את המשתנה BOARD_MKBOOTIMG_ARGS כדי לציין את גרסת הכותרת של תמונת האתחול:

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • מוודאים שהמשתנה BOARD_PREBUILT_DTBOIMAGE מוגדר לנתיב של תמונת ה-DTBO. מערכת ה-build של Android משתמשת במשתנה כדי להגדיר את הארגומנט recovery_dtbo של הכלי mkbootimg במהלך יצירת תמונת השחזור.

אם המשתנים BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS ו-BOARD_PREBUILT_DTBOIMAGE מוגדרים בצורה נכונה, מערכת ה-Build של Android כוללת את ה-DTBO שצוין על ידי המשתנה BOARD_PREBUILT_DTBOIMAGE ב-recovery.img.

הטמעה של ACPIO

במכשירים מסוג Non-A/B עם Android מגרסה 9 ואילך, אפשר להשתמש בתמונת שכבת-על של ACPIO (במקום בתמונת DTBO) ולאכלס את הקטע recovery_acpio (במקום הקטע recovery_dtbo) בתמונת השחזור. כדי לכלול את התמונה recovery_acpio ב-recovery.img, במכשיר BoardConfig.mk:

  • מגדירים את ההגדרה BOARD_INCLUDE_RECOVERY_ACPIO לערך true:

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • מרחיבים את המשתנה BOARD_MKBOOTIMG_ARGS כדי לציין את גרסת הכותרת של תמונת האתחול. המשתנה חייב להיות גדול מ-1 או שווה לו כדי לתמוך ב-ACPIO.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • מוודאים שהמשתנה BOARD_RECOVERY_ACPIO מוגדר לנתיב של תמונת ACPIO. מערכת ה-build של Android משתמשת במשתנה כדי להגדיר את הארגומנט recovery_acpio של הכלי mkbootimg במהלך יצירת קובץ האימג' לשחזור.

אם המשתנים BOARD_INCLUDE_RECOVERY_ACPIO, BOARD_MKBOOTIMG_ARGS ו-BOARD_RECOVERY_ACPIO מוגדרים בצורה נכונה, מערכת ה-build של Android כוללת את ה-ACPIO שצוין על ידי המשתנה BOARD_RECOVERY_ACPIO ב-recovery.img.