עדכון OTA למכשירי A/B עם מחיצות דינמיות

‫Android 10 תומך במחיצות דינמיות, מערכת חלוקה למחיצות במרחב המשתמש שיכולה ליצור, לשנות את הגודל ולמחוק מחיצות במהלך עדכונים דרך האוויר (OTA).

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

רקע

יש מחיצה אחת (super) במכשיר. המחיצה הזו לא מסומנת בסיומת של משבצת. מכשיר החסימה חייב להתקיים לצד הרשומה blk_device של /misc ב-fstab. לדוגמה, אם בקובץ fstab מופיעים:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

אז מכשיר הבלוק של super חייב להיות קיים ב-/dev/block/bootdevice/by-name/super, אבל המחיצה super לא צריכה להופיע בקובץ fstab.

במחיצה super יש שני משבצות מטא-נתונים, שממוספרות מ-0 עד 1, שמתאימות למשבצות A/B למחיצות. בדף הזה, משבצות המטא-נתונים נקראות Metadata S (מקור) ו-Metadata T (יעד). באופן דומה, המחיצות נקראות system_s,‏ vendor_t וכן הלאה.

לפני השדרוג, המטא-נתונים S מכילים את המידע על המחיצות הדינמיות שנמצאות בשימוש (בדרך כלל, system_s,‏ vendor_s,‏ product_s וכן הלאה). המערכת קוראת את המידות של המחיצות האלה במהלך העדכון, ולכן אי אפשר למחוק אותן.

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

דוגמה למטא-נתונים במכשיר:

  • מטא-נתונים 0
    • קבוצה foo_a
      • מחיצה system_a
      • מחיצה product_services_a
      • מחיצות אחרות שעודכנו על ידי Foo
    • Group bar_a
      • מחיצה vendor_a
      • מחיצה product_a
      • מחיצות אחרות שעודכנו על ידי Bar
    • קבוצה foo_b (שאריות משדרוג קודם)
    • קבוצה bar_b (שאריות משדרוג קודם)
  • מטא-נתונים 1
    • קבוצה foo_a (שאריות משדרוג קודם)
    • קבוצה bar_a (שאריות משדרוג קודם)
    • קבוצה foo_b
      • מחיצה system_b
      • מחיצה product_services_b
      • מחיצות אחרות שעודכנו על ידי Foo
    • קבוצה bar_b
      • מחיצה vendor_b
      • מחיצה product_b
      • מחיצות אחרות שעודכנו על ידי Bar

אתם יכולים להשתמש בכלי lpdump (קוד המקור נמצא ב-system/extras/partition_tools) כדי להעביר את המטא-נתונים למכשיר שלכם. לדוגמה:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

עדכון תהליך העבודה

  1. מאתחלים את המטא-נתונים של המחיצה super.
    1. טוענים את המידות של המחיצות הדינמיות של המקור מ-Metadata S. נסמן את המטא-נתונים שנטענו באות M.
    2. מסירים מקבוצת היעדים והמחיצות (לדוגמה, foo_t, bar_t) את M כך ש-M תכיל רק מחיצות וקבוצות עם הסיומת _s.
    3. מוסיפים קבוצות יעד ומחיצות בהתאם לשדה dynamic_partition_metadata במניפסט העדכון.
      אפשר לראות את הגודל של כל מחיצה ב-new_partition_info.
    4. כותבים M במטא-נתונים T.
    5. ממפים את המחיצות שנוספו ב-device mapper כניתנות לכתיבה.
  2. מחילים את העדכון על המכשירים החסומים.
    1. במידת הצורך, ממפים את מחיצות המקור בממפה המכשיר כקריאה בלבד. הפעולה הזו נדרשת להעברה צדדית כי המחיצות של המקור לא ממופות לפני העדכון.
    2. החלת עדכון מלא או עדכון דלתא על כל מכשירי הבלוק במשבצת היעד.
    3. מבצעים Mount למחיצות כדי להריץ את הסקריפט אחרי ההתקנה, ואז מבטלים את ה-Mount של המחיצות.
  3. מבטלים את המיפוי של מחיצות היעד.

לפני העדכון ואחריו, מאפייני המערכת הבאים צריכים לקבל את הערכים המתאימים:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

הוספת קבוצות ומחיצות למניפסט העדכון

כשמבצעים עדכון OTA במכשיר A/B עם מחיצות דינמיות, או במכשיר A/B שמוסיפים לו תמיכה במחיצות דינמיות, צריך להוסיף קבוצות ומחיצות למניפסט העדכון. קטע הקוד שבהמשך מציג מידע נוסף על מניפסט העדכון לתמיכה במחיצות דינמיות. מידע מפורט על כל שדה מופיע במאמר update_metadata.proto.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}