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

אנדרואיד 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 מצטברים משתמשים בלוגיקה הבאה:

  1. כיווץ מחיצות/מחיקת מחיצות/הזזת מחיצות מחוץ לקבוצה (כדי שיהיה מספיק מקום לכווץ קבוצות)
  2. כווץ קבוצות (כדי שיהיה מספיק מקום לגדל קבוצות)
  3. גידול קבוצות (כדי שיהיה לנו מספיק מקום לגדל/להוסיף מחיצות)
  4. הגדל מחיצות / הוסף מחיצות / העבר מחיצות לקבוצה חדשה

בפירוט, 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 מלאים משתמשים בלוגיקה הבאה:

  1. מחק את כל הקבוצות והמחיצות הקיימות
  2. הוסף קבוצות
  3. הוסף מחיצות

בפירוט, 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