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

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

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

רקע

יש מחיצה אחת מסוג super במכשיר. למחיצה הזו אין סיומת של חריץ. מכשיר ה-block חייב להתקיים יחד עם הרשומה 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 וכן הלאה.

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

המחיצות שייכות לקבוצות עדכונים. צפייה הטמעה מחיצות דינמיות.

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

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

אפשר להשתמש בכלי 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. טעינת היקפי ההרשאות של המחיצות הדינמיות של המקור מ-'מטא-נתונים' י' נניח ש-M הוא המטא-נתונים שנטענו.
    2. מסירים את הקבוצות והמחיצות של היעד (לדוגמה, foo_t,‏ bar_t) מ-M, כך ש-M מכיל רק מחיצות וקבוצות עם הסיומת _s.
    3. מוסיפים קבוצות יעד ומחיצות לפי השדה dynamic_partition_metadata במניפסט העדכון.
      הגודל של כל מחיצה מופיע ב-new_partition_info.
    4. כותבים M ל-Metadata T.
    5. מיפוי המחיצות שנוספו במיפוי המכשיר כניתנות לכתיבה.
  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;
}