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