Mise à jour OTA pour les appareils A/B avec partitions dynamiques

Android 10 est compatible avec les partitions dynamiques, un système de partitionnement de l'espace utilisateur qui permet de créer, redimensionner et supprimer des partitions lors des mises à jour OTA (Over-The-Air).

Cette page explique comment redimensionner les partitions dynamiques lors d'une mise à jour pour les appareils A/B lancés avec la prise en charge des partitions dynamiques, pour les appareils exécutant Android 9 et versions antérieures.

Arrière-plan

L'appareil comporte une partition super. Cette partition n'est pas suffixée par un emplacement. Le périphérique de bloc doit exister avec l'entrée blk_device pour /misc dans fstab. Par exemple, si le fichier fstab liste les éléments suivants :

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

Le périphérique de bloc pour super doit alors exister dans /dev/block/bootdevice/by-name/super, mais la partition super n'a pas besoin d'être listée dans le fichier fstab.

Dans la partition super, il existe deux emplacements de métadonnées, numérotés 0 et 1, qui correspondent aux emplacements A/B pour les partitions. Sur cette page, les emplacements de métadonnées sont appelés "Métadonnées S (source)" et "Métadonnées T (cible)". De même, les partitions sont appelées system_s, vendor_t, etc.

Avant la mise à niveau, Metadata S contient les informations sur les partitions dynamiques utilisées (généralement system_s, vendor_s, product_s, etc.). Le système lit les étendues de ces partitions lors de la mise à jour. Elles ne peuvent donc pas être supprimées.

Les partitions appartiennent à des groupes de mise à jour. Pour en savoir plus, consultez Implémenter des partitions dynamiques.

Voici un exemple de métadonnées sur un appareil :

  • Métadonnées 0
    • Groupe foo_a
      • Partition system_a
      • Partition product_services_a
      • Autres partitions mises à jour par Foo
    • Groupe bar_a
      • Partition vendor_a
      • Partition product_a
      • Autres partitions mises à jour par Bard
    • Groupe foo_b (restant de la mise à niveau précédente)
    • Groupe bar_b (restant de la mise à niveau précédente)
  • Métadonnées 1
    • Groupe foo_a (restant de la mise à niveau précédente)
    • Groupe bar_a (restant de la mise à niveau précédente)
    • Groupe foo_b
      • Partition system_b
      • Partition product_services_b
      • Autres partitions mises à jour par Foo
    • Groupe bar_b
      • Partition vendor_b
      • Partition product_b
      • Autres partitions mises à jour par Bard

Vous pouvez utiliser l'outil lpdump (code source sous system/extras/partition_tools) pour vider les métadonnées sur votre appareil. Exemple :

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

Mettre à jour le flux

  1. Initialisez les métadonnées de la partition super.
    1. Chargez les étendues des partitions dynamiques sources à partir des métadonnées S. Soit M les métadonnées chargées.
    2. Supprimez les groupes cibles et les partitions (par exemple, foo_t, bar_t) de M afin que M ne contienne que des partitions et des groupes avec le suffixe _s.
    3. Ajoutez des groupes cibles et des partitions en fonction du champ dynamic_partition_metadata dans le fichier manifeste de mise à jour.
      La taille de chaque partition est indiquée dans new_partition_info.
    4. Écrire M dans les métadonnées T.
    5. Mappez les partitions ajoutées sur le mappeur de périphériques en tant qu'écriture.
  2. Appliquez la mise à jour sur les périphériques de bloc.
    1. Si nécessaire, mappez les partitions sources sur le mappeur de périphériques en lecture seule. Cette étape est nécessaire pour le transfert latéral, car les partitions sources ne sont pas mappées avant la mise à jour.
    2. Applique une mise à jour complète ou différentielle à tous les périphériques de bloc dans l'emplacement cible.
    3. Montez les partitions pour exécuter le script post-installation, puis démontez-les.
  3. Dissociez les partitions cibles.

Avant et après la mise à jour, les propriétés système suivantes doivent avoir les valeurs respectives :

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

Ajouter des groupes et des partitions au fichier manifeste de mise à jour

Lorsque vous effectuez une mise à jour OTA sur un appareil A/B avec des partitions dynamiques ou sur un appareil A/B qui ajoute la prise en charge des partitions dynamiques, vous devez ajouter des groupes et des partitions au fichier manifeste de mise à jour. L'extrait ci-dessous fournit des informations supplémentaires sur le fichier manifeste de mise à jour pour prendre en charge les partitions dynamiques. Pour obtenir une documentation détaillée sur chaque champ, consultez 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;
}