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 peut créer, redimensionner et supprimer des partitions lors des mises à jour OTA (Over-The-Air).

Cette page explique comment redimensionner des 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

Il existe une partition super sur l'appareil. 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 contient les éléments suivants :

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

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

Dans la partition super, il existe deux emplacements de métadonnées, numérotés 0 et 1, correspondant 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, les métadonnées S contiennent les informations des 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 Bar
    • Groupe foo_b (reste de la mise à niveau précédente)
    • Groupe bar_b (reste de la mise à niveau précédente)
  • Métadonnées 1
    • Groupe foo_a (reste de la mise à niveau précédente)
    • Groupe bar_a (reste 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 Bar

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

Flux de mise à jour

  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 et partitions cibles (par exemple, foo_t, bar_t) de M afin que M contienne uniquement des partitions et des groupes avec le _s suffixe.
    3. Ajoutez des groupes et des partitions cibles en fonction du dynamic_partition_metadata champ dans le fichier manifeste de mise à jour.
      La taille de chaque partition se trouve dans new_partition_info.
    4. Écrivez M dans les métadonnées T.
    5. Mappez les partitions ajoutées sur le mappeur d'appareils 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 d'appareils en lecture seule. Cela est nécessaire pour le chargement latéral, car les partitions sources ne sont pas mappées avant la mise à jour.
    2. Appliquez une mise à jour complète ou delta à tous les périphériques de bloc dans l'emplacement cible slot.
    3. Installez les partitions pour exécuter le script post-installation, puis désinstallez-les.
  3. Désinstallez 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 de code 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;
}