OTA pour les appareils A/B avec partitions dynamiques

Android 10 prend en charge 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 en direct (OTA).

Cette page décrit 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

Il y a une super partition sur l'appareil. Cette partition n'a pas de suffixe d'emplacement. Le périphérique bloc doit exister avec l'entrée blk_device pour /misc dans fstab . Par exemple, si le fichier fstab répertorie :

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

Ensuite, 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 répertoriée dans le fichier fstab .

Dans la super partition, il y a deux emplacements de métadonnées , numérotés 0 et 1, correspondant aux emplacements A/B des partitions. Dans cette page, les emplacements de métadonnées sont appelés Metadata S (source) et Metadata 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 extensions de ces partitions lors de la mise à jour, elles ne peuvent donc pas être supprimées.

Les partitions appartiennent à des groupes de mise à jour . Voir Implémentation de partitions dynamiques pour plus de détails.

Un exemple de métadonnées sur un appareil est le suivant.

  • Métadonnées 0
    • Groupe foo_a
      • system_a de partition_a
      • Partitionner product_services_a
      • Autres partitions mises à jour par Foo
    • Barre de groupe_a
      • vendor_a de partition_a
      • product_a de partition_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 à jour précédente)
    • Groupe bar_a (reste de la mise à niveau précédente)
    • Groupe foo_b
      • system_b de partition_b
      • Partitionner product_services_b
      • Autres partitions mises à jour par Foo
    • bar_b de groupe_b
      • vendor_b de partition_b
      • product_b de partition_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. Par 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 super partition.
    1. Chargez les extensions 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 contienne uniquement les partitions et les groupes avec le suffixe _s .
    3. Ajoutez des groupes cibles et des partitions en fonction du champ dynamic_partition_metadata dans le manifeste de mise à jour.
      La taille de chaque partition peut être trouvée dans new_partition_info .
    4. Écrivez M dans les métadonnées T.
    5. Mappez les partitions ajoutées sur le mappeur de périphériques comme étant accessibles en écriture.
  2. Appliquez la mise à jour sur les appareils bloqués.
    1. Si nécessaire, mappez les partitions sources sur le mappeur de périphériques en lecture seule. Ceci 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 bloqués sur l'emplacement cible.
    3. Montez les partitions pour exécuter le script de post-installation, puis démontez les partitions.
  3. Supprimez le mappage des 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 manifeste de mise à jour

Lorsque vous effectuez une mise à jour OTA sur un périphérique A/B avec des partitions dynamiques ou sur un périphérique A/B qui ajoute la prise en charge des partitions dynamiques, vous devez ajouter des groupes et des partitions au manifeste de mise à jour. L'extrait ci-dessous montre des informations supplémentaires sur le manifeste de mise à jour pour prendre en charge les partitions dynamiques. Voir update_metadata.proto pour une documentation détaillée sur chaque champ.

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;
}