OTA-Updates für A/B-Geräte mit dynamischen Partitionen

Android 10 unterstützt dynamische Partitionen, ein Partitionierungssystem im Userspace, mit dem Partitionen während Over-the-Air-Updates (OTA) erstellt, in der Größe geändert und gelöscht werden können.

Auf dieser Seite wird beschrieben, wie Sie die Größe dynamischer Partitionen während eines Updates für A/B-Geräte anpassen, die mit Unterstützung für dynamische Partitionen eingeführt wurden, und für Geräte mit Android 9 und niedrigeren Versionen.

Hintergrund

Auf dem Gerät gibt es eine super-Partition. Diese Partition hat kein Slot-Suffix. Das Blockgerät muss zusammen mit dem blk_device Eintrag für /misc in fstab vorhanden sein. Wenn in der Datei fstab beispielsweise Folgendes aufgeführt ist:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Dann muss das Blockgerät für super in /dev/block/bootdevice/by-name/super vorhanden sein. Die super-Partition muss jedoch nicht in der Datei fstab aufgeführt sein.

In der super-Partition gibt es zwei Metadaten-Slots mit den Nummern 0 und 1, die den A/B-Slots für Partitionen entsprechen. Auf dieser Seite werden die Metadaten-Slots als „Metadaten S (Quelle)“ und „Metadaten T (Ziel)“ bezeichnet. Ebenso werden Partitionen als system_s, vendor_t usw. bezeichnet.

Vor dem Upgrade enthält „Metadaten S“ die Informationen für die verwendeten dynamischen Partitionen (in der Regel system_s, vendor_s, product_s, usw.). Das System liest die Extents für diese Partitionen während des Updates, daher können sie nicht gelöscht werden.

Partitionen gehören zu Update-Gruppen. Weitere Informationen finden Sie unter Dynamische Partitionen implementieren.

Ein Beispiel für Metadaten auf einem Gerät sieht so aus:

  • Metadaten 0
    • Gruppe foo_a
      • Partition system_a
      • Partition product_services_a
      • Andere von Foo aktualisierte Partitionen
    • Gruppe bar_a
      • Partition vendor_a
      • Partition product_a
      • Andere von Bar aktualisierte Partitionen
    • Gruppe foo_b (Überbleibsel aus vorherigem Upgrade)
    • Gruppe bar_b (Überbleibsel aus vorherigem Upgrade)
  • Metadaten 1
    • Gruppe foo_a (Überbleibsel aus vorherigem Upgrade)
    • Gruppe bar_a (Überbleibsel aus vorherigem Upgrade)
    • Gruppe foo_b
      • Partition system_b
      • Partition product_services_b
      • Andere von Foo aktualisierte Partitionen
    • Gruppe bar_b
      • Partition vendor_b
      • Partition product_b
      • Andere von Bar aktualisierte Partitionen

Mit dem lpdump Tool (Quellcode unter system/extras/partition_tools) können Sie die Metadaten auf Ihrem Gerät sichern. Beispiel:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Update-Ablauf

  1. Metadaten der super Partition initialisieren
    1. Laden Sie die Extents für die dynamischen Quellpartitionen aus „Metadaten S“. Sei M die geladenen Metadaten.
    2. Entfernen Sie Zielgruppen und -partitionen (z. B. foo_t, bar_t) aus M, sodass M nur Partitionen und Gruppen mit dem _s Suffix enthält.
    3. Fügen Sie Zielgruppen und -partitionen gemäß dem dynamic_partition_metadata Feld im Update Manifest hinzu.
      Die Größe der einzelnen Partitionen finden Sie unter new_partition_info.
    4. Schreiben Sie M in „Metadaten T“.
    5. Ordnen Sie die hinzugefügten Partitionen dem Device Mapper als beschreibbar zu.
  2. Update auf die Blockgeräte anwenden
    1. Ordnen Sie die Quellpartitionen gegebenenfalls dem Device Mapper als Lesezugriff zu. Dies ist für das Sideloading erforderlich, da die Quell Partitionen vor dem Update nicht zugeordnet werden.
    2. Wenden Sie ein vollständiges oder ein Delta-Update auf alle Blockgeräte im Ziel Slot an.
    3. Hängen Sie die Partitionen ein, um das Post-Install-Skript auszuführen, und hängen Sie sie dann wieder aus.
  3. Zuordnung der Zielpartitionen aufheben

Vor und nach dem Update sollten die folgenden Systemeigenschaften die entsprechenden Werte haben:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Gruppen und Partitionen zum Update-Manifest hinzufügen

Wenn Sie ein OTA-Update auf einem A/B-Gerät mit dynamischen Partitionen, oder einem A/B-Gerät durchführen, das Unterstützung für dynamische Partitionen hinzufügt, müssen Sie dem Update-Manifest Gruppen und Partitionen hinzufügen. Der folgende Codeblock enthält zusätzliche Informationen zum Update-Manifest zur Unterstützung dynamischer Partitionen. Eine detaillierte Dokumentation zu den einzelnen Feldern finden Sie unter 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;
}