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

Android 10 unterstützt dynamische Partitionen, ein Partitionssystem im Userspace, mit dem Partitionen während Over-the-air-Updates (OTA) erstellt, neu formatiert 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 ändern, die mit dynamischer Partitionsunterstützung eingeführt wurden, und für Geräte mit Android 9 und niedriger.

Hintergrund

Auf dem Gerät befindet sich eine super-Partition. Diese Partition hat kein Slotsuffix. Das Blockgerät muss zusammen mit dem blk_device-Eintrag für /misc in fstab vorhanden sein. Beispiel: In der fstab-Datei ist Folgendes aufgeführt:

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

In diesem Fall muss das blockorientierte Gerät für super in /dev/block/bootdevice/by-name/super vorhanden sein, die Partition super muss jedoch nicht in der Datei fstab aufgeführt sein.

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

Vor dem Upgrade enthält Metadata S die Informationen zu den 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, sodass sie nicht gelöscht werden können.

Partitionen gehören zu Aktualisierungsgruppen. Weitere Informationen finden Sie unter Dynamische Partitionen implementieren.

Hier ein Beispiel für Metadaten auf einem Gerät:

  • Metadaten 0
    • Gruppe foo_a
      • Partition system_a
      • Partition product_services_a
      • Andere Partitionen, die von Foo aktualisiert wurden
    • Gruppe „bar_a“
      • Partition vendor_a
      • Partition product_a
      • Andere Partitionen, die von Bar aktualisiert wurden
    • 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 Partitionen, die von Foo aktualisiert wurden
    • Gruppe bar_b
      • Partition vendor_b
      • Partition product_b
      • Andere Partitionen, die von Bar aktualisiert wurden

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

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

Ablauf aktualisieren

  1. Initialisieren Sie die super-Partitionsmetadaten.
    1. Laden Sie die Extents für die dynamischen Quellpartitionen aus den Metadaten S. M sind 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 Suffix _s enthält.
    3. Fügen Sie Zielgruppen und Partitionen gemäß dem Feld dynamic_partition_metadata im aktualisierten Manifest hinzu.
      Die Größe der einzelnen Partitionen finden Sie unter new_partition_info.
    4. Schreibe M in das Metadaten-Feld T.
    5. Ordnen Sie die hinzugefügten Partitionen im Geräte-Mapper als beschreibbar zu.
  2. Wenden Sie das Update auf die Blockgeräte an.
    1. Weisen Sie die Quellpartitionen bei Bedarf dem Geräte-Mapper als schreibgeschützt zu. Dies ist für das Sideloading erforderlich, da die Quellpartitionen vor dem Update nicht zugeordnet werden.
    2. Wenden Sie ein vollständiges oder Delta-Update auf alle Blockgeräte am Ziel-Steckplatz an.
    3. Sie müssen die Partitionen bereitstellen, um das Skript nach der Installation auszuführen, und sie dann wieder trennen.
  3. Entfernen Sie die Zuordnung der Zielpartitionen.

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

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

Dem Update-Manifest Gruppen und Partitionen hinzufügen

Wenn Sie ein Over-the-air-Update auf einem A/B-Gerät mit dynamischen Partitionen oder einem A/B-Gerät ausführen, das die Unterstützung für dynamische Partitionen hinzufügt, müssen Sie dem Update-Manifest Gruppen und Partitionen hinzufügen. Das folgende Snippet enthält weitere Informationen zum Update-Manifest zur Unterstützung dynamischer Partitionen. Ausführliche Informationen zu den einzelnen Feldern finden Sie in 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;
}