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
- מחיצות אחרות שעודכנו על ידי 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
תהליך העדכון
- מאתחלים את המטא-נתונים של מחיצה
super
.- טוענים את ה-extents של המחיצות הדינמיות של המקור מ-Metadata S. נניח ש-M הוא המטא-נתונים שנטענו.
-
מסירים את הקבוצות והמחיצות של היעד (לדוגמה,
foo_t
,bar_t
) מ-M, כך ש-M מכיל רק מחיצות וקבוצות עם הסיומת_s
. -
מוסיפים קבוצות יעד ומחיצות בהתאם לשדה
dynamic_partition_metadata
במניפסט העדכון.
הגודל של כל מחיצה מופיע ב-new_partition_info
. - כתיבת M למטא-נתונים T.
- ממפים את המחיצות שנוספו בממפה של המכשיר כמחיצות לכתיבה.
- מחילים את העדכון במכשירים שחוסמו.
- במידת הצורך, ממפים את המחיצות של המקור בממפה של המכשיר כקריאה בלבד. הדבר נחוץ להעלאה צדדית כי המחיצות של המקור לא ממפות לפני העדכון.
- החלת עדכון מלא או עדכון דלתא על כל מכשירי החסימה בחריץ היעד.
- מחברים את המחיצות כדי להריץ את הסקריפט שלאחר ההתקנה, ואז מנתקים את המחיצות.
- ביטול המיפוי של המחיצות היעד
לפני ואחרי העדכון, למאפייני המערכת הבאים צריכים להיות הערכים המתאימים:
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; }