Images de récupération

Sur les appareils non A/B, l'image de récupération doit contenir des informations provenant d'un blob de l'arborescence des périphériques (DTB) ou d'une image de superposition Advanced Configuration and Power Interface (ACPI). Lorsque ces appareils démarrent en mode Recovery, le bootloader peut alors charger l'image de superposition compatible avec l'image Recovery. Les appareils compatibles avec les mises à jour A/B (fluides) doivent utiliser la récupération comme démarrage au lieu d'une partition de récupération distincte (pour en savoir plus, consultez Implémenter les mises à jour A/B).

Les options permettant d'inclure un DTBO/ACPIO de récupération dans l'image de démarrage/récupération diffèrent selon les versions d'Android.

Version Mettre à jour le schéma Conformité GKI Version de l'en-tête de démarrage (appareils de lancement) Version de l'en-tête de démarrage (appareils en cours de mise à niveau) Image de récupération dédiée requise
11 A/B,
A/B virtuel
Oui 3* N/A Non
A/B,
A/B virtuel
Non 2, 3 0, 1, 2, 3 Non
non-A/B Oui 3 N/A Oui
non-A/B Non 2, 3 0, 1, 2, 3 Oui
10 (Q) A/B N/A 2 0, 1, 2 Non
non-A/B N/A 2 0, 1, 2 Oui
9 (P) A/B N/A 1 0, 1 Non
non-A/B N/A 1 0, 1 Oui
8 (O) A/B N/A N/A (considéré comme 0) N/A (considéré comme 0) Non
non-A/B N/A N/A (considéré comme 0) N/A (considéré comme 0) Oui

* Les appareils A/B exécutant Android 11 ou version ultérieure et utilisant la Generic Kernel Image (GKI) doivent utiliser une version 3 de l'en-tête de démarrage principal pour être compatibles avec la partition de démarrage du fournisseur.

Points essentiels :

  • Les appareils A/B n'ont pas besoin de spécifier d'image de récupération, car les mises à jour A/B utilisent deux ensembles de partitions (y compris boot et dtbo) et basculent entre elles lors des mises à jour, ce qui élimine le besoin d'une image de récupération. Les appareils A/B peuvent toujours utiliser une image de récupération dédiée.

  • Les appareils non A/B lancés avec Android 11 ou version ultérieure et utilisant une version 3 de l'en-tête de démarrage doivent spécifier explicitement une version 2 de l'en-tête de démarrage pour l'image de récupération séparément. Exemple :

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Pour les architectures qui ne sont pas compatibles avec les arbres d'appareils, l'image de récupération peut inclure une image ACPIO au lieu d'une image DTBO.

À propos des échecs de mise à jour OTA et des images de récupération

Pour éviter les échecs de mise à jour OTA (Over The Air) sur les appareils non A/B, l'image de récupération doit être autonome et indépendante des autres images. Lors d'une mise à jour OTA, si un problème survient après la mise à jour de l'image de superposition (mais avant la fin de la mise à jour complète), l'appareil tente de démarrer en mode Recovery pour terminer la mise à jour OTA. Toutefois, comme la partition de superposition a déjà été mise à jour, une incohérence peut se produire avec l'image de récupération (qui n'a pas encore été mise à jour).

Pour éviter que la récupération ne dépende de la partition DTBO/ACPIO lors d'une mise à jour, les appareils non A/B exécutant Android 9 ou version ultérieure peuvent spécifier une image DTBO/ACPIO de récupération contenant des informations provenant de l'image de superposition en tant que section distincte dans le format d'image de démarrage (doit utiliser une version d'en-tête de démarrage de 1 ou 2).

Modifications apportées à l'image de démarrage

Pour permettre à l'image de récupération de contenir le DTBO ou l'ACPIO de récupération sur les appareils non A/B exécutant Android 9 ou version ultérieure, mettez à jour la structure de l'image de démarrage comme suit.

Section "Image de démarrage" Nombre de pages
En-tête de démarrage (1 page) 1
Kernel (l pages) l = (kernel_size + page_size - 1) / page_size
Ramdisk (pages m) m = (ramdisk_size + page_size - 1) / page_size
Bootloader de deuxième niveau (n pages) n = (second_size + page_size - 1) / page_size
DTBO ou ACPIO (ou pages) de récupération o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Pour en savoir plus sur les arguments de l'outil mkbootimg permettant de spécifier la version de l'en-tête de l'image de démarrage et les chemins d'accès aux images de superposition, consultez Gestion des versions de l'en-tête de l'image de démarrage.

Implémenter DTBO

Les appareils non A/B équipés d'Android 9 ou version ultérieure peuvent remplir la section recovery_dtbo de l'image de récupération. Pour inclure l'image recovery_dtbo dans recovery.img, dans le BoardConfig.mk de l'appareil :

  • Définissez la configuration BOARD_INCLUDE_RECOVERY_DTBO sur true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Étendez la variable BOARD_MKBOOTIMG_ARGS pour spécifier la version de l'en-tête de l'image de démarrage :

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Assurez-vous que la variable BOARD_PREBUILT_DTBOIMAGE est définie sur le chemin d'accès de l'image DTBO. Le système de compilation Android utilise la variable pour définir l'argument recovery_dtbo de l'outil mkbootimg lors de la création de l'image de récupération.

Si les variables BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS et BOARD_PREBUILT_DTBOIMAGE sont correctement définies, le système de compilation Android inclut le DTBO spécifié par la variable BOARD_PREBUILT_DTBOIMAGE dans recovery.img.

Implémenter ACPIO

Les appareils non A/B exécutant Android 9 ou version ultérieure peuvent utiliser une image de superposition ACPIO (au lieu d'une image DTBO) et peuvent remplir la section recovery_acpio (au lieu de la section recovery_dtbo) de l'image de récupération. Pour inclure l'image recovery_acpio dans recovery.img, dans le BoardConfig.mk de l'appareil :

  • Définissez la configuration BOARD_INCLUDE_RECOVERY_ACPIO sur true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Étendez la variable BOARD_MKBOOTIMG_ARGS pour spécifier la version de l'en-tête de l'image de démarrage. La variable doit être supérieure ou égale à 1 pour prendre en charge la récupération ACPIO.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Assurez-vous que la variable BOARD_RECOVERY_ACPIO est définie sur le chemin de l'image ACPIO. Le système de compilation Android utilise la variable pour définir l'argument recovery_acpio de l'outil mkbootimg lors de la création de l'image de récupération.

Si les variables BOARD_INCLUDE_RECOVERY_ACPIO, BOARD_MKBOOTIMG_ARGS et BOARD_RECOVERY_ACPIO sont correctement définies, le système de compilation Android inclut l'ACPIO spécifié par la variable BOARD_RECOVERY_ACPIO dans recovery.img.