Pour implémenter les mises à jour OTA (Over The Air), le bootloader doit pouvoir accéder à un disque RAM de récupération au démarrage. Si l'appareil utilise une image de récupération AOSP non modifiée, le bootloader lit les 32 premiers octets de la partition misc
. Si les données correspondent à boot-recovery
, le bootloader démarre dans l'image recovery
. Cette méthode permet de poursuivre toute tâche de récupération en attente (par exemple, l'application d'une OTA ou la suppression de données).
Pour en savoir plus sur le contenu d'un bloc dans le flash utilisé pour les communications par la récupération et le bootloader, consultez bootable/recovery/bootloader_message/bootloader_message.h.
Appareils avec des mises à jour A/B
Pour prendre en charge les mises à jour OTA sur les appareils qui utilisent des mises à jour A/B, assurez-vous que le bootloader de l'appareil répond aux critères suivants.
Critères généraux
Toutes les partitions mises à jour via une mise à jour OTA doivent être actualisables pendant le démarrage du système principal (et non lors de la récupération).
Pour démarrer la partition
system
, le bootloader transmet la valeur suivante sur la ligne de commande du kernel:ro root=/dev/[node] rootwait init=/init
.C'est au framework Android d'appeler
markBootSuccessful
à partir du HAL. Le bootloader ne doit jamais marquer une partition comme correctement démarrée.
Prise en charge du HAL de contrôle du démarrage
Le bootloader doit être compatible avec le HAL boot_control
tel que défini dans hardware/libhardware/include/hardware/boot_control.h
. L'outil de mise à jour interroge le HAL de contrôle du démarrage, met à jour l'emplacement de démarrage inutilisé, modifie l'emplacement actif à l'aide du HAL et redémarre dans le système d'exploitation mis à jour. Pour en savoir plus, consultez la section Implémenter le HAL de contrôle du démarrage.
Compatibilité avec les emplacements
Le bootloader doit prendre en charge les fonctionnalités liées aux partitions et aux emplacements, y compris:
Les noms de partition doivent inclure un suffixe identifiant les partitions qui appartiennent à un emplacement particulier du bootloader. Pour chaque partition de ce type, il existe une variable
has-slot:partition base name
correspondante avec une valeur deyes
. Les emplacements sont nommés par ordre alphabétique (a, b, c, etc.) et correspondent aux partitions avec le suffixe_a
,_b
,_c
, etc. Le bootloader doit indiquer au système d'exploitation quel emplacement a été démarré à l'aide de la propriété de ligne de commandeandroidboot.slot_suffix
. Cette propriété est définie via bootconfig pour les appareils lancés avec Android 12 ou version ultérieure.La valeur
slot-retry-count
est réinitialisée sur une valeur positive (généralement3
), soit par le HAL de la commande de démarrage via le rappelsetActiveBootSlot
, soit via la commandefastboot set_active
. Lors de la modification d'une partition faisant partie d'un emplacement, le bootloader efface le message "ayant démarré" et réinitialise le nombre de tentatives pour l'emplacement.
Le bootloader doit également déterminer quel emplacement charger. La figure montre un exemple de processus de décision.
Identifiez l'emplacement à essayer. N'essayez pas de charger un emplacement marqué
slot-unbootable
. Cet emplacement doit être cohérent avec les valeurs renvoyées par fastboot et est appelé emplacement actuel.Si l'emplacement actuel n'est pas marqué comme
slot-successful
et qu'il comporte unslot-retry-count = 0
, marquez-le commeslot-unbootable
. Sélectionnez ensuite un autre emplacement, qui n'est pas marquéunbootable
, mais est marqué commeslot-successful
. Cet emplacement est désormais l'emplacement sélectionné. Si aucun emplacement actuel n'est disponible, démarrez en mode récupération ou affichez un message d'erreur pertinent à l'utilisateur.Sélectionnez le
boot.img
approprié et incluez le chemin d'accès à la partition système correcte dans la ligne de commande du noyau.Renseignez le paramètre
slot_suffix
de la ligne de commande du noyau.Démarrez. Si la valeur n'est pas
slot-successful
, diminuezslot-retry-count
.
L'utilitaire fastboot
détermine la partition à flasher lors de l'exécution de commandes de flash. Par exemple, l'exécution de la commande fastboot flash system system.img
interroge d'abord la variable current-slot
, puis concatène le résultat au système pour générer le nom de la partition à flasher (system_a
, system_b
, etc.).
Lorsque vous définissez l'emplacement actuel à l'aide de la commande fastboot set_active
ou de la commande HAL de contrôle du démarrage setActiveBootSlot
, le bootloader doit mettre à jour l'emplacement actuel, effacer slot-unbootable
et slot-successful
, et réinitialiser le nombre de tentatives (c'est le seul moyen d'effacer slot-unbootable
).
Appareils sans mises à jour A/B
Pour prendre en charge les mises à jour OTA sur les appareils qui n'utilisent pas de mises à jour A/B (voir Appareils non A/B pouvant être mis à jour), assurez-vous que le bootloader de l'appareil répond aux critères suivants.
La partition
recovery
doit contenir une image capable de lire une image système à partir d'une partition compatible (cache
,userdata
) et de l'écrire dans la partitionsystem
.Le bootloader doit permettre de démarrer directement en mode récupération.
Si les mises à jour d'images radio sont prises en charge, la partition
recovery
doit également pouvoir flasher la radio. Pour ce faire, procédez de l'une des manières suivantes:Le bootloader flashe la radio. Dans ce cas, il devrait être possible de redémarrer à partir de la partition de récupération dans le bootloader pour terminer la mise à jour.
L'image de récupération clignote la radio. Cette fonctionnalité peut être fournie sous la forme d'une bibliothèque ou d'un utilitaire binaire.