Prise en charge des mises à jour OTA

Pour prendre en charge les mises à jour OTA (over-the-air) , le chargeur de démarrage doit pouvoir accéder à un disque RAM de récupération pendant le démarrage. Si le périphérique utilise une image de récupération AOSP non modifiée, le chargeur de démarrage lit les 32 premiers octets de la partition misc ; si les données correspondent à boot-recovery , le chargeur de démarrage démarre dans l'image recovery . Cette méthode permet à tout travail de récupération en attente (par exemple, l'application d'un OTA ou la suppression de données) de se poursuivre jusqu'à son terme.

Pour plus de détails sur le contenu d'un bloc en flash utilisé pour les communications par recovery et le bootloader, reportez-vous à bootable/recovery/bootloader_message/bootloader_message.h .

Appareils avec mises à jour A/B

Pour prendre en charge les mises à jour OTA sur les appareils qui utilisent les mises à jour A/B , assurez-vous que le chargeur de démarrage de l'appareil répond aux critères suivants.

Critères généraux

  • Toutes les partitions mises à jour via un OTA doivent pouvoir être mises à jour pendant le démarrage du système principal (et non mises à jour lors de la récupération).

  • Pour démarrer la partition system , le chargeur de démarrage transmet la valeur suivante sur la ligne de commande du noyau : ro root=/dev/[node] rootwait init=/init .

  • Il est de la responsabilité du framework Android d'appeler markBootSuccessful depuis le HAL. Le chargeur de démarrage ne doit jamais marquer une partition comme démarrée avec succès.

Prise en charge du contrôle de démarrage HAL

Le chargeur de démarrage doit prendre en charge le HAL boot_control tel que défini dans hardware/libhardware/include/hardware/boot_control.h ). Le programme de mise à jour interroge le HAL de contrôle de démarrage , met à jour l'emplacement de démarrage non utilisé actuellement, modifie l'emplacement actif à l'aide du HAL et redémarre dans le système d'exploitation mis à jour. Pour plus de détails, consultez Implémentation du contrôle de démarrage HAL .

Prise en charge des emplacements

Le chargeur de démarrage doit prendre en charge les fonctionnalités liées aux partitions et aux emplacements, notamment :

  • Les noms de partition doivent inclure un suffixe qui identifie les partitions appartenant à un emplacement particulier dans le chargeur de démarrage. Pour chacune de ces partitions, il existe une variable correspondante has-slot: partition base name avec une valeur de yes . Les emplacements sont nommés par ordre alphabétique comme a, b, c, etc. correspondant aux partitions avec le suffixe _a , _b , _c , etc. Le chargeur de démarrage doit informer le système d'exploitation quel emplacement a été démarré à l'aide de la propriété de ligne de commande androidboot.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 à une valeur positive (généralement 3 ), soit par le contrôle de démarrage HAL via le rappel setActiveBootSlot , soit via la commande fastboot set_active . Lors de la modification d'une partition faisant partie d'un emplacement, le chargeur de démarrage efface "démarré avec succès" et réinitialise le nombre de tentatives pour l'emplacement.

Le chargeur de démarrage doit également déterminer quel emplacement charger. La figure montre un exemple de processus de décision.

Flux d'emplacement du chargeur de démarrage
Figure 1. Flux d'emplacement du chargeur de démarrage
  1. Déterminez quel 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.

  2. Si l'emplacement actuel n'est pas marqué comme étant slot-successful et a un slot-retry-count = 0 , marquez l'emplacement actuel comme étant slot-unbootable . Sélectionnez ensuite un autre emplacement qui n'est pas marqué comme unbootable et qui est marqué comme étant slot-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 significatif à l'utilisateur.

  3. Sélectionnez le boot.img approprié et incluez le chemin d'accès à la partition système correcte sur la ligne de commande du noyau.

  4. Remplissez le paramètre slot_suffix de la ligne de commande du noyau.

  5. Botte. S'il n'est pas marqué slot-successful , décrémentez slot-retry-count .

L'utilitaire fastboot détermine quelle partition flasher lors de l'exécution de commandes 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 qui doit être flashée ( system_a , system_b , etc.).

Lors de la définition de l'emplacement actuel à l'aide de la commande fastboot set_active ou de la commande de contrôle de démarrage HAL setActiveBootSlot , le chargeur de démarrage 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 . slot-unbootable ).

Appareils sans mises à jour A/B

Pour prendre en charge les mises à jour OTA sur les appareils qui n'utilisent pas les mises à jour A/B (voir Appareils pouvant être mis à jour non A/B ), assurez-vous que le chargeur de démarrage 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 prise en charge ( cache , userdata ) et de l'écrire sur la partition system .

  • Le chargeur de démarrage doit prendre en charge le redémarrage directement en mode de récupération.

  • Si les mises à jour des images radio sont prises en charge, la partition recovery devrait également pouvoir flasher la radio. Cela peut être accompli de deux manières :

    • Le chargeur de démarrage fait clignoter la radio. Dans ce cas, il devrait être possible de redémarrer à partir de la partition de récupération vers le chargeur de démarrage pour terminer la mise à jour.

    • L'image de récupération fait clignoter la radio. Cette fonctionnalité peut être fournie sous forme de bibliothèque binaire ou d'utilitaire.