עדכון 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. מפעילים את המחיצות כדי להריץ את הסקריפט אחרי ההתקנה, ואז מבטלים את הפעלת המחיצות.
  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;
}