אנדרואיד 10 תומך במחיצות דינמיות , מערכת מחיצות למרחב משתמש שיכולה ליצור, לשנות גודל ולהרוס מחיצות במהלך עדכוני אויר (OTA).
דף זה מתאר כיצד לקוחות OTA משנים את גודל המחיצות הדינמיות במהלך עדכון עבור התקנים שאינם A/B.
עבור התקנים שאינם A/B, עדכון OTA עבור מחיצות דינמיות מוחל באמצעות updater
בתוך חבילת העדכון.
עדכן התקני השקה
סעיף זה חל על התקנים שאינם A/B המופעלים עם תמיכה במחיצות דינמיות; מכשירים אלה משדרגים מאנדרואיד 10 למהדורות גבוהות יותר.
צור חבילות עדכון
חבילות עדכון OTA נוצרות על ידי הסקריפט ota_from_target_files
, הממוקם תחת build/make/tools/releasetools
. כברירת מחדל, הסקריפט יוצר חבילה שמעדכנת את מחיצות system
vendor
. אם יש מחיצות דינמיות נוספות, כגון product
, product_services
או odm
, יש להפיק את העדכונים שלהן בקוד ספציפי למכשיר .
כדי ליצור עדכונים, במודול Python המורחב, הטמיע את FullOTA_GetBlockDifferences()
ו- IncrementalOTA_GetBlockDifferences()
. שתי הפונקציות הללו מחזירות רשימה של אובייקטי BlockDifference
, שכל אחד מהם מתאר את תיקון העדכון שיוחל על מחיצה. אין לשנות ידנית מחיצות המוחזרות על ידי שתי הפונקציות הללו או לאמת במקום אחר, למשל ב *_InstallBegin()
או *_InstallEnd()
.
דוגמה ליצירת עדכונים:
# device/yoyodyne/tardis/releasetools.py import os from common import BlockDifference, EmptyImage, GetUserImage # The joined list of user image partitions of source and target builds. # - Items should be added to the list if new dynamic partitions are added. # - Items should not be removed from the list even if dynamic partitions are # deleted. When generating an incremental OTA package, this script needs to # know that an image is present in source build but not in target build. USERIMAGE_PARTITIONS = [ "product", "odm", ] def GetUserImages(input_tmp, input_zip): return {partition: GetUserImage(partition, input_tmp, input_zip) for partition in USERIMAGE_PARTITIONS if os.path.exists(os.path.join(input_tmp, "IMAGES", partition + ".img"))} def FullOTA_GetBlockDifferences(info): images = GetUserImages(info.input_tmp, info.input_zip) return [BlockDifference(partition, image) for partition, image in images.items()] def IncrementalOTA_GetBlockDifferences(info): source_images = GetUserImages(info.source_tmp, info.source_zip) target_images = GetUserImages(info.target_tmp, info.target_zip) # Use EmptyImage() as a placeholder for partitions that will be deleted. for partition in source_images: target_images.setdefault(partition, EmptyImage()) # Use source_images.get() because new partitions are not in source_images. return [BlockDifference(partition, target_image, source_images.get(partition)) for partition, target_image in target_images.items()]
עדכון זרימה
מאחורי הקלעים, הפונקציות הבאות מתווספות לתסריט ה-edify:
-
unmap_partition(name)
- בטל את מיפוי המחיצה אם ממופה, אחרת אל תעשה דבר.
- החזר את המחרוזת
t
על הצלחה, או מחרוזת ריקה על כישלון.
-
map_partition(name)
- מפה את המחיצה אם עדיין לא מופה.
- החזר את הנתיב המוחלט של התקן החסימה הממופת עם הצלחה, או מחרוזת ריקה בכשל.
-
update_dynamic_partitions(op_list)
- החל את רשימת הפעולות הנתונה על מטא נתונים של מחיצות דינמיות, בטל את מיפוי המחיצות במידת הצורך.
- החזר
t
על הצלחה, או מחרוזת ריקה על כישלון.
הארגומנט op_list
ל- update_dynamic_partitions
מצביע על קובץ בחבילת העדכון. כל שורה בקובץ מציינת פעולה. אם פעולה כלשהי נכשלת, update_dynamic_partitions
מחזירה מיד מחרוזת ריקה. הפעולות הן:
-
resize partition-name size
- בטל את מיפוי המחיצה ולאחר מכן שנה את size .
-
remove partition_name
- בטל את מיפוי המחיצה ולאחר מכן הסר אותה.
-
add partition-name group-name
- הוסף מחיצה חדשה לקבוצה שצוינה.
- בטל אם הקבוצה לא קיימת או אם המחיצה כבר קיימת.
-
move partition-name group-name
- העבר את המחיצה לקבוצה שצוינה.
- בטל אם הקבוצה לא קיימת או המחיצה לא קיימת.
-
add_group group-name maximum-size
- הוסף קבוצה עם השם הנתון והגודל המקסימלי.
- בטל אם הקבוצה כבר קיימת.
- maximum_size של 0 אומר שאין מגבלות גודל על מחיצות בקבוצה. נדרשות בדיקות נוספות כדי להבטיח שהמחיצות בקבוצה אינן חורגות מהשטח הפנוי במכשיר.
-
resize_group group-name maximum-size
- שנה את גודל הקבוצה לגודל המקסימלי הנתון.
- בטל אם הקבוצה לא קיימת.
- maximum_size של 0 אומר שאין מגבלות גודל על מחיצות בקבוצה. נדרשות בדיקות נוספות כדי להבטיח שהמחיצות בקבוצה אינן חורגות מהשטח הפנוי במכשיר.
-
remove_group group-name
- הסר קבוצה.
- בטל אם יש מחיצות בקבוצה.
-
remove_all_groups
- בטל את מיפוי כל המחיצות מממפ המכשיר.
- הסר את כל המחיצות והקבוצות.
OTA מצטבר
עדכוני OTA מצטברים משתמשים בלוגיקה הבאה:
- כיווץ מחיצות/מחיקת מחיצות/הזזת מחיצות מחוץ לקבוצה (כדי שיהיה מספיק מקום לכווץ קבוצות)
- כווץ קבוצות (כדי שיהיה מספיק מקום לגדל קבוצות)
- גידול קבוצות (כדי שיהיה לנו מספיק מקום לגדל/להוסיף מחיצות)
- הגדל מחיצות / הוסף מחיצות / העבר מחיצות לקבוצה חדשה
בפירוט, update-script
נוצר עם ההיגיון הזה:
for each shrinking partition: block_image_update(map_partition(name), …) update_dynamic_partitions(op_list) for each growing / adding partition: block_image_update(map_partition(name), …)
קובץ op_list
עבור update_dynamic_partitions
נוצר עם ההיגיון הזה:
for each deleting partition: remove for each partition that changes groups: move to "default" for each shrinking partition: resize for each shrinking / removing group: resize_group / remove_group for each growing / adding group: resize_group / add_group for each adding partition: add for each growing / adding partition: resize for each partition that changes groups: move to target group
OTA מלא
עדכוני OTA מלאים משתמשים בלוגיקה הבאה:
- מחק את כל הקבוצות והמחיצות הקיימות
- הוסף קבוצות
- הוסף מחיצות
בפירוט, update-script
נוצר עם ההיגיון הזה:
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
קובץ op_list
עבור update_dynamic_partitions
נוצר עם ההיגיון הזה:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize