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

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 Sie die Größe dynamischer Partitionen während eines Updates für A/B-Geräte mit Unterstützung für dynamische Partitionen auf Geräten mit Android 9 und niedriger anpassen.

Hintergrund

Auf dem Gerät befindet sich eine super-Partition. Diese Partition hat kein Slotsuffix. Das Blockgerät muss zusammen mit dem Eintrag blk_device 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 Metadatenslots, nummeriert mit 0 und 1, die 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 Ausmaße dieser Partitionen während der Aktualisierung, damit 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 aktualisiert durch Bar
    • 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 (übriges Upgrade aus dem vorherigen 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 Updatemanifest 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. Vollständiges oder Delta-Update auf alle Blockgeräte am Ziel-Steckplatz anwenden
    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 der Aktualisierung sollten die folgenden Systemattribute 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 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;
}