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

Android 10 unterstützt dynamische Partitionen, ein Partitionierungssystem für den Nutzerbereich, mit dem Partitionen während OTA-Updates (Over-the-Air) erstellt, in der Größe angepasst 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 auf denen Android 9 und niedriger ausgeführt wird.

Hintergrund

Auf dem Gerät ist eine super-Partition vorhanden. Diese Partition hat kein Slot-Suffix. Das Blockgerät muss zusammen mit dem blk_device-Eintrag für /misc in fstab vorhanden sein. Beispiel: In der Datei fstab sind folgende Einträge aufgeführt:

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

Das Blockgerät für super muss dann 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 mit den Nummern 0 und 1, die den A/B-Slots für Partitionen entsprechen. Auf dieser Seite werden die Metadaten-Slots als „Metadata S“ (Quelle) und „Metadata T“ (Ziel) bezeichnet. Entsprechend werden Partitionen als system_s, vendor_t usw. bezeichnet.

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

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

Hier ist 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 von Bar aktualisierte Partitionen
    • Gruppe foo_b (Überbleibsel aus dem vorherigen Upgrade)
    • Gruppe bar_b (Überbleibsel aus dem vorherigen Upgrade)
  • Metadaten 1
    • Gruppe foo_a (Überbleibsel aus dem vorherigen Upgrade)
    • Gruppe bar_a (Überbleibsel 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 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

Aktualisierungsablauf

  1. Partitionsmetadaten für super initialisieren:
    1. Laden Sie die Bereiche für die dynamischen Quellpartitionen aus Metadata 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 Suffix _s enthält.
    3. Fügen Sie Zielgruppen und Partitionen gemäß dem Feld dynamic_partition_metadata im Aktualisierungsmanifest hinzu.
      Die Größe der einzelnen Partitionen finden Sie unter new_partition_info.
    4. Schreibe M in Metadaten T.
    5. Die hinzugefügten Partitionen im Gerätezurordner als beschreibbar zuordnen.
  2. Wenden Sie das Update auf die Blockgeräte an.
    1. Ordnen Sie die Quellpartitionen bei Bedarf dem Device Mapper als schreibgeschützt zu. Das ist für das Sideloading erforderlich, da die Quellpartitionen vor dem Update nicht zugeordnet werden.
    2. Wendet ein vollständiges oder 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. 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 dem Aktualisierungsmanifest hinzufügen

Wenn Sie ein OTA-Update auf einem A/B-Gerät mit dynamischen Partitionen oder einem A/B-Gerät durchführen, auf dem Unterstützung für dynamische Partitionen hinzugefügt wird, müssen Sie dem Update-Manifest Gruppen und Partitionen hinzufügen. Das Snippet unten 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;
}