Android 10 unterstützt dynamische Partitionen, ein Partitionssystem im Userspace, mit dem Partitionen bei Over-the-air-Updates (OTA) erstellt, neu formatiert und gelöscht werden können.
Auf dieser Seite wird beschrieben, wie OTA-Clients die Größe dynamischer Partitionen während eines Updates für Nicht-A/B-Geräte anpassen.
Bei Geräten ohne A/B-Partition wird das OTA-Update für dynamische Partitionen mithilfe der updater
im Update-Paket angewendet.
Startgeräte aktualisieren
Dieser Abschnitt gilt für Geräte ohne A/B-Partition, die mit dynamischer Partitionsunterstützung ausgeliefert werden. Auf diesen Geräten wird von Android 10 auf eine höhere Version umgestellt.
Update-Pakete generieren
OTA-Update-Pakete werden vom ota_from_target_files
-Script unter build/make/tools/releasetools
generiert. Standardmäßig weist das Skript
generiert ein Paket, das system
und
vendor
Partitionen. Wenn es zusätzliche dynamische Partitionen wie product
, product_services
oder odm
gibt, müssen ihre Updates in gerätespezifischem Code generiert werden.
Um Aktualisierungen zu generieren, implementieren Sie im erweiterten Python-Modul FullOTA_GetBlockDifferences()
und IncrementalOTA_GetBlockDifferences()
. Diese beiden
Funktionen eine Liste von BlockDifference
-Objekten zurückgeben,
die jeweils den Update-Patch beschreiben, der auf eine
-Partition an. Partitionen, die von diesen beiden Funktionen zurückgegeben werden, sollten nicht manuell geändert oder an anderer Stelle bestätigt werden, z. B. in *_InstallBegin()
oder *_InstallEnd()
.
Beispiel für die Generierung eines Updates:
# 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()]
Ablauf aktualisieren
Im Hintergrund werden die folgenden Funktionen zum Edify-Element hinzugefügt. Skript:
unmap_partition(name)
- Heben Sie die Zuordnung der Partition auf, falls sie zugeordnet ist. Andernfalls unternehmen Sie nichts.
- Gib bei Erfolg den String
t
zurück oder bei einem Fehler einen leeren String.
map_partition(name)
- Weisen Sie die Partition zu, falls noch nicht geschehen.
- Gibt bei Erfolg den absoluten Pfad des zugeordneten Blockgeräts zurück oder bei Fehler einen leeren String.
update_dynamic_partitions(op_list)
- Wenden Sie die angegebene Vorgangsliste auf die Metadaten der dynamischen Partition an. die Zuordnungen von Partitionen aufheben.
-
Gibt bei Erfolg
t
oder bei Fehler einen leeren String zurück.
Das Argument op_list
für update_dynamic_partitions
verweist auf eine Datei im Update-Paket. Jede Zeile in der Datei gibt eine Operation an. Falls vorhanden
Vorgang schlägt fehl, update_dynamic_partitions
sofort
gibt einen leeren String zurück. Die Vorgänge sind:
resize partition-name size
- Heben Sie die Zuordnung der Partition auf und ändern Sie die Größe in size.
remove partition_name
- Heben Sie die Zuordnung der Partition auf und entfernen Sie sie.
add partition-name group-name
- Fügen Sie der angegebenen Gruppe eine neue Partition hinzu.
- Der Vorgang wird abgebrochen, wenn die Gruppe nicht vorhanden oder die Partition bereits vorhanden ist existiert.
move partition-name group-name
- Verschieben Sie die Partition in die angegebene Gruppe.
- Der Vorgang wird abgebrochen, wenn die Gruppe oder Partition nicht vorhanden ist.
-
add_group group-name maximum-size
- Fügen Sie eine Gruppe mit dem angegebenen Namen und der maximalen Größe hinzu.
- Abbrechen, wenn die Gruppe bereits vorhanden ist.
- Ein Wert von 0 für maximum_size bedeutet, dass es keine Größenbeschränkungen für Partitionen in der Gruppe gibt. Zusätzliche Tests sind erforderlich, um dass die Partitionen in der Gruppe auf dem Gerät verfügbar sind.
-
resize_group group-name maximum-size
- Ändern Sie die Größe der Gruppe auf die angegebene maximale Größe.
- Abbruch, wenn die Gruppe nicht vorhanden ist.
- Ein Wert von 0 für maximum_size bedeutet, dass es keine Größenbeschränkungen für Partitionen in der Gruppe gibt. Zusätzliche Tests sind erforderlich, um dass die Partitionen in der Gruppe auf dem Gerät verfügbar sind.
remove_group group-name
- Eine Gruppe entfernen.
- Abbrechen, wenn sich in der Gruppe Partitionen befinden.
remove_all_groups
- Entfernen Sie alle Partitionen aus dem Geräte-Mapper.
- Entfernen Sie alle Partitionen und Gruppen.
Inkrementelles OTA
Für inkrementelle OTA-Updates wird die folgende Logik verwendet:
- Partitionen verkleinern, löschen oder aus der Gruppe verschieben, damit genügend Speicherplatz vorhanden ist, um Gruppen zu verkleinern
- Gruppen verkleinern, damit genügend Platz für eine Erweiterung vorhanden ist
- Gruppen vergrößern (damit genügend Platz für die Erweiterung/das Hinzufügen von Partitionen vorhanden ist)
- Partitionen erweitern/Partitionen hinzufügen/Partitionen in neue Gruppe verschieben
Im Einzelnen wird update-script
damit generiert.
Logik:
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), …)
Die Datei op_list
für
Damit wird update_dynamic_partitions
generiert.
Logik:
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
Vollständiges OTA
Für vollständige OTA-Updates wird die folgende Logik verwendet:
- Alle vorhandenen Gruppen und Partitionen löschen
- Gruppen hinzufügen
- Partitionen hinzufügen
Im Einzelnen wird update-script
damit generiert.
Logik:
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
Die op_list
-Datei für update_dynamic_partitions
wird mit dieser Logik generiert:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize