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 détruire des partitions lors des mises à jour Over The Air (OTA).

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 ou version antérieure.

Arrière-plan

Une partition super est présente sur l'appareil. Cette partition n'est pas suffixée par un emplacement. L'appareil 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, correspondant aux emplacements A/B des 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 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 mises à jour. Pour en savoir plus, consultez la page 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 (restant d'une mise à niveau précédente)
    • Groupe bar_b (restant d'une mise à niveau précédente)
  • Métadonnées 1
    • Groupe foo_a (reste de la mise à niveau précédente)
    • Groupe bar_a (restant d'une 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

Mettre à jour le flux

  1. Initialisez les métadonnées de partition super.
    1. Chargez les extensions des partitions dynamiques sources à partir de Metadata S. Soit M les métadonnées chargées.
    2. Supprimez les groupes et les partitions cibles (par exemple, foo_t, bar_t) de M afin que M ne contienne que les partitions et les groupes avec le suffixe _s.
    3. Ajoutez des groupes et des partitions cibles en fonction du champ dynamic_partition_metadata dans le fichier manifeste de mise à jour.
      La taille de chaque partition se trouve dans new_partition_info.
    4. Écrire M dans Métadonnées T.
    5. Mappez les partitions ajoutées sur le mappeur d'appareil en tant qu'entrées accessibles en écriture.
  2. Appliquez la mise à jour sur les appareils de stockage en mode bloc.
    1. Si nécessaire, mappez les partitions sources sur le mappeur d'appareils en lecture seule. Cela est nécessaire pour le téléchargement parallèle, car les partitions sources ne sont pas mappées avant la mise à jour.
    2. Appliquez une mise à jour complète ou delta à tous les appareils de blocage à l'emplacement cible.
    3. Installez les partitions pour exécuter le script post-installation, puis désinstallez-les.
  3. Désallouez 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 un appareil A/B qui prend en charge les partitions dynamiques, vous devez ajouter des groupes et des partitions au fichier manifeste de mise à jour. L'extrait ci-dessous présente des informations supplémentaires sur le fichier manifeste de mise à jour pour prendre en charge les partitions dynamiques. Pour en savoir plus 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;
}