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

Android 10 unterstützt dynamische Partitionen , ein Userspace-Partitionierungssystem, das bei Over-the-Air-Updates (OTA) Partitionen erstellen, in der Größe ändern und zerstören kann.

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 Unterstützung für dynamische Partitionen gestartet wurden, für Geräte mit Android 9 und niedriger .

Hintergrund

Es gibt eine super auf dem Gerät. Diese Partition hat kein Slot-Suffix. Das Blockgerät muss zusammen mit dem blk_device Eintrag für /misc in fstab vorhanden sein. Wenn die fstab Datei beispielsweise Folgendes auflistet:

/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, aber die super Partition muss nicht in der fstab Datei aufgeführt sein.

In der 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. Ebenso werden Partitionen als system_s , vendor_t usw. bezeichnet.

Vor dem Upgrade enthalten Metadaten S die Informationen für die verwendeten dynamischen Partitionen (normalerweise system_s , vendor_s , product_s usw.). Das System liest während des Updates die Extents für diese Partitionen, sodass sie nicht gelöscht werden können.

Partitionen gehören zu Updategruppen . Weitere Informationen finden Sie unter Implementieren dynamischer Partitionen .

Ein Beispiel für Metadaten auf einem Gerät ist wie folgt.

  • Metadaten 0
    • Gruppe foo_a
      • system_a
      • Partitionieren Sie product_services_a .
      • Andere von Foo aktualisierte Partitionen
    • Gruppe bar_a
      • vendor_a
      • Partitionieren Sie product_a .
      • Andere von Bar aktualisierte Partitionen
    • Gruppe foo_b (Überbleibsel vom vorherigen Upgrade)
    • Gruppe bar_b (übrig vom vorherigen Upgrade)
  • Metadaten 1
    • Gruppe foo_a (übrig vom vorherigen Upgrade)
    • Gruppe bar_a (übrig vom vorherigen Upgrade)
    • Gruppe foo_b
      • system_b
      • Partitionieren Sie product_services_b .
      • Andere von Foo aktualisierte Partitionen
    • Gruppe bar_b
      • vendor_b
      • Partitionieren Sie product_b .
      • Andere von Bar aktualisierte Partitionen

Sie können das Tool lpdump (Quellcode unter system/extras/partition_tools ) verwenden, um die Metadaten auf Ihrem Gerät zu sichern. Zum Beispiel:

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

Aktualisierungsablauf

  1. Initialisieren Sie die Metadaten der super .
    1. Laden Sie die Bereiche für die dynamischen Quellpartitionen aus den Metadaten S. Seien 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 entsprechend dem Feld dynamic_partition_metadata im Update-Manifest hinzu.
      Die Größe jeder Partition finden Sie in new_partition_info .
    4. Schreiben Sie M in Metadaten T.
    5. Ordnen Sie die hinzugefügten Partitionen im Device Mapper als beschreibbar zu.
  2. Wenden Sie das Update auf den Blockgeräten an.
    1. Ordnen Sie bei Bedarf die Quellpartitionen im Geräte-Mapper als schreibgeschützt zu. Dies ist für das Querladen erforderlich, da die Quellpartitionen vor dem Update nicht zugeordnet werden.
    2. Wenden Sie ein vollständiges oder Delta-Update auf alle Blockgeräte im Zielsteckplatz an.
    3. Hängen Sie die Partitionen ein, um das Nachinstallationsskript auszuführen, und heben Sie dann die Bereitstellung der Partitionen auf.
  3. Heben Sie die Zuordnung der Zielpartitionen auf.

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

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

Fügen Sie Gruppen und Partitionen zum Update-Manifest hinzu

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 Gruppen und Partitionen zum Update-Manifest hinzufügen. Der folgende Ausschnitt zeigt zusätzliche Informationen zum Update-Manifest zur Unterstützung dynamischer Partitionen. Eine ausführliche Dokumentation zu jedem Feld 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;
}