Implémenter des mises à jour OTA

Pour implémenter les mises à jour OTA (Over-The-Air), le bootloader doit pouvoir accéder à un disque RAM de récupération lors du 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 sur l'image recovery. Cette méthode permet à toute tâche de récupération en attente (par exemple, l'application d'une mise à jour OTA ou la suppression de données) de se poursuivre jusqu'à son terme.

Pour en savoir plus sur le contenu d'un bloc dans le flash utilisé pour les communications par récupération et le bootloader, consultez 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 bootloader de l'appareil répond aux critères suivants.

Critères généraux

  • Toutes les partitions mises à jour via OTA doivent pouvoir être mises à jour lorsque le système principal est démarré (et non mis à jour en mode Recovery).

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

  • Il incombe au framework Android d'appeler markBootSuccessful à partir de la HAL. Le bootloader ne doit jamais marquer une partition comme ayant démarré avec succès.

Prise en charge de la couche d'abstraction matérielle (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. Le programme de mise à jour interroge la HAL de contrôle du démarrage, met à jour l'emplacement de démarrage non utilisé, modifie l'emplacement actif à l'aide de la HAL et redémarre dans le système d'exploitation mis à jour. Pour en savoir plus, consultez Implémenter le HAL de contrôle du démarrage.

Compatibilité avec les emplacements

Le bootloader doit être compatible avec les fonctionnalités liées aux partitions et aux emplacements, y compris :

  • Les noms de partition doivent inclure un suffixe qui identifie les partitions appartenant à un emplacement particulier dans le bootloader. Pour chaque partition de ce type, il existe une variable has-slot:partition base name correspondante avec une valeur de yes. 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 informer le système d'exploitation de l'emplacement qui 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 sur une valeur positive (généralement 3), soit par le HAL de contrôle du démarrage via le rappel setActiveBootSlot, soit par la commande fastboot set_active. Lorsque vous modifiez une partition qui fait partie d'un emplacement, le bootloader efface "successfully booted" (démarrage réussi) et réinitialise le nombre de tentatives pour l'emplacement.

Le bootloader doit également déterminer l'emplacement à charger. La figure montre un exemple de processus de décision.

Flux d'emplacement du bootloader
Figure 1. Flux d'emplacement du bootloader
  1. Déterminez 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.

  2. Si le créneau actuel n'est pas marqué comme slot-successful et comporte un slot-retry-count = 0, marquez-le comme slot-unbootable. Sélectionnez ensuite un autre emplacement qui n'est pas marqué unbootable, mais slot-successful. Cet emplacement est désormais sélectionné. Si aucun emplacement actuel n'est disponible, démarrez en mode Recovery ou affichez un message d'erreur explicite à 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. Renseignez le paramètre de ligne de commande du noyau slot_suffix.

  5. Démarrage Si la valeur n'est pas définie sur slot-successful, décrémentez slot-retry-count.

L'utilitaire fastboot détermine la partition à flasher lors de l'exécution de commandes de flashage. 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 la seule façon 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 les mises à jour A/B (voir Appareils pouvant être mis à jour sans A/B), 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 partition system.

  • Le bootloader doit permettre de démarrer directement en mode Recovery.

  • Si les mises à jour des images radio sont prises en charge, la partition recovery doit également pouvoir flasher la radio. Pour cela, deux possibilités s'offrent à vous :

    • 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 flashe la radio. Cette fonctionnalité peut être fournie sous la forme d'une bibliothèque ou d'un utilitaire binaire.