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 OTA (Over-the-Air).
Cette page explique comment les clients OTA redimensionnent les partitions dynamiques lors d'une mise à jour pour les appareils autres que A/B.
Pour les appareils autres que A/B, la mise à jour OTA des partitions dynamiques est appliquée
à l'aide de updater
dans le package de mise à jour.
Modifier les appareils de lancement
Cette section s'applique aux appareils autres qu'A/B qui sont lancés avec la prise en charge des partitions dynamiques. Ces appareils passent d'Android 10 à des versions ultérieures.
Générer des packages de mise à jour
Les packages de mise à jour OTA sont générés par le script ota_from_target_files
, situé sous build/make/tools/releasetools
. Par défaut, le script
génère un package qui met à jour system
.
Partitions vendor
. Si d'autres éléments dynamiques
des partitions, telles que product
,
product_services
ou odm
, son
les mises à jour doivent être générées
spécifiques à l’appareil
code.
Pour générer des mises à jour, dans le module Python étendu, implémentez
FullOTA_GetBlockDifferences()
et
IncrementalOTA_GetBlockDifferences()
Ces deux
renvoient une liste d'objets BlockDifference
.
chacun décrivant le correctif de mise à jour qui serait appliqué
partition. Les partitions renvoyées par ces deux fonctions ne doivent pas être
modifiées manuellement ou validées ailleurs, par exemple dans
*_InstallBegin()
ou *_InstallEnd()
.
Exemple de génération de mises à jour :
# device/yoyodyne/tardis/releasetools.py import os from common import BlockDifference, EmptyImage, GetUserImage # The joined list of user image partitions of source and target builds. # - Items should be added to the list if new dynamic partitions are added. # - Items should not be removed from the list even if dynamic partitions are # deleted. When generating an incremental OTA package, this script needs to # know that an image is present in source build but not in target build. USERIMAGE_PARTITIONS = [ "product", "odm", ] def GetUserImages(input_tmp, input_zip): return {partition: GetUserImage(partition, input_tmp, input_zip) for partition in USERIMAGE_PARTITIONS if os.path.exists(os.path.join(input_tmp, "IMAGES", partition + ".img"))} def FullOTA_GetBlockDifferences(info): images = GetUserImages(info.input_tmp, info.input_zip) return [BlockDifference(partition, image) for partition, image in images.items()] def IncrementalOTA_GetBlockDifferences(info): source_images = GetUserImages(info.source_tmp, info.source_zip) target_images = GetUserImages(info.target_tmp, info.target_zip) # Use EmptyImage() as a placeholder for partitions that will be deleted. for partition in source_images: target_images.setdefault(partition, EmptyImage()) # Use source_images.get() because new partitions are not in source_images. return [BlockDifference(partition, target_image, source_images.get(partition)) for partition, target_image in target_images.items()]
Flux de mise à jour
En arrière-plan, les fonctions suivantes ont été ajoutées à la bibliothèque Edify. script:
unmap_partition(name)
- Désassociez la partition si elle est mappée, sinon ne faites rien.
- Renvoyez la chaîne
t
en cas de réussite ou une valeur vide en cas d'échec.
map_partition(name)
- Mappez la partition si elle n'est pas déjà mappée.
- Renvoie le chemin absolu de l'appareil de stockage en mode bloc mappé en cas de réussite. ou une chaîne vide en cas d'échec.
update_dynamic_partitions(op_list)
- Appliquer la liste d'opérations donnée aux métadonnées de partition dynamique le démappage des partitions si nécessaire.
-
Renvoyez
t
en cas de réussite ou une chaîne vide en cas d'échec.
L'argument op_list
de update_dynamic_partitions
pointe vers un fichier du package de mise à jour. Chaque ligne du fichier spécifie une opération. Le cas échéant
l'opération échoue, update_dynamic_partitions
immédiatement
renvoie une chaîne vide. Les opérations sont les suivantes:
resize partition-name size
- Désassociez la partition, puis redimensionnez-la en size.
remove partition_name
- Désassociez la partition, puis supprimez-la.
add partition-name group-name
- Ajoute une nouvelle partition au groupe spécifié.
- Arrêtez l'opération si le groupe n'existe pas ou si la partition existe déjà.
move partition-name group-name
- Déplacez la partition vers le groupe spécifié.
- Annulez si le groupe ou la partition n'existe pas.
-
add_group group-name maximum-size
- Ajoutez un groupe avec le nom donné et la taille maximale.
- Annulez si le groupe existe déjà.
- Une maximum_size de 0 signifie qu'il n'y a pas de limite de taille. sur les partitions du groupe. Des tests supplémentaires sont nécessaires pour s'assurer que les partitions du groupe ne dépassent pas l'espace disponible sur l'appareil.
-
resize_group group-name maximum-size
- Redimensionnez le groupe pour qu'il atteigne la taille maximale donnée.
- Arrêtez si le groupe n'existe pas.
- Une maximum_size de 0 signifie qu'il n'y a pas de limite de taille. sur les partitions du groupe. Des tests supplémentaires sont nécessaires pour s'assurer que les partitions du groupe ne dépassent pas l'espace disponible sur l'appareil.
remove_group group-name
- Supprimer un groupe
- Annulez si le groupe contient des partitions.
remove_all_groups
- Supprimez toutes les partitions du mappeur d'appareils.
- Supprimez toutes les partitions et tous les groupes.
OTA incrémental
Les mises à jour OTA incrémentielles utilisent la logique suivante:
- Réduire les partitions/Supprimer des partitions/Déplacer des partitions de façon à avoir assez d'espace pour réduire les groupes.
- Réduire les groupes (afin d'avoir suffisamment d'espace pour augmenter le nombre de groupes)
- Étendre les groupes (afin que nous ayons suffisamment d'espace pour étendre/ajouter des partitions)
- Augmenter les partitions/Ajouter des partitions/Déplacer des partitions vers un nouveau groupe
Plus précisément, update-script
est généré avec la logique suivante :
for each shrinking partition: block_image_update(map_partition(name), …) update_dynamic_partitions(op_list) for each growing / adding partition: block_image_update(map_partition(name), …)
Le fichier op_list
pour update_dynamic_partitions
est généré avec cette logique :
for each deleting partition: remove for each partition that changes groups: move to "default" for each shrinking partition: resize for each shrinking / removing group: resize_group / remove_group for each growing / adding group: resize_group / add_group for each adding partition: add for each growing / adding partition: resize for each partition that changes groups: move to target group
OTA complète
Les mises à jour OTA complètes utilisent la logique suivante :
- Supprimer tous les groupes et partitions existants
- Ajouter des groupes
- Ajouter des partitions
Plus précisément, update-script
est généré avec la logique suivante :
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
Le fichier op_list
de
update_dynamic_partitions
est généré avec ce
logique:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize