Images de récupération

Sur les appareils autres qu'A/B, l'image de récupération doit contenir des informations provenant d'un blob de l'arborescence des appareils (DTB) ou d'une image superposée ACPI (Advanced Configuration and Power Interface). Lorsque ces appareils démarrent en mode récupération, le bootloader peut charger l'image superposée compatible avec l'image de récupération. Appareils compatibles avec le test A/B (fluide) les mises à jour doivent utiliser la récupération comme démarrage partition de récupération distincte (pour plus d'informations, voir Implémentation des tests A/B ).

Les options permettant d'inclure une valeur DTBO/ACPIO de récupération dans le cadre du démarrage/de la récupération diffèrent d'une version d'Android à l'autre.

Version Mettre à jour le schéma Conformité avec GKI Version de l'en-tête de démarrage (appareils de lancement) Version de l'en-tête de démarrage (mise à niveau des appareils) Image de récupération dédiée requise
11 A/B,
Virtual A/B
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 (valeur considérée comme 0) N/A (valeur considérée comme 0) Non
non-A/B N/A N/A (valeur considérée comme 0) N/A (valeur considérée comme 0) Oui

* Appareils A/B équipés d'Android version 11 ou ultérieure et avec l'image générique du noyau (GKI) doit utiliser un version d'en-tête principale de 3 soit compatible avec le démarrage fournisseur partition.

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 utiliser une image de récupération dédiée.

  • Appareils non A/B équipés d'Android 11 ou version ultérieure Si vous utilisez un en-tête de démarrage version 3, vous devez spécifier explicitement un en-tête de démarrage version 2 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 arborescences d'appareils, l'image de récupération peut inclure une image ACPIO au lieu d'une image DTBO.

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

Pour éviter les défaillances OTA (Over The Air) sur les appareils autres que 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 superposée (mais avant la fin de la mise à jour complète), l'appareil tente de démarrer en mode récupération pour terminer la mise à jour OTA. Toutefois, comme la partition en 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 autres qu'A/B exécutant Android 9 ou version ultérieure peuvent spécifier une image DTBO/ACPIO de récupération contenant des informations de l'image superposée en tant que section distincte dans le format d'image de démarrage (vous devez utiliser une version d'en-tête de démarrage 1 ou 2).

Modifications de l'image de démarrage

Pour permettre à l'image de récupération de contenir le service de récupération DTBO ou ACPIO sur des serveurs autres que A/B appareils équipés d'Android 9 ou version ultérieure, mettez à jour le système de démarrage comme suit.

Section "Image de démarrage" Nombre de pages
En-tête de démarrage (1 page) 1
Noyau (l pages) l = (kernel_size + page_size - 1) / page_size
Ramdisk (m pages) m = (ramdisk_size + page_size - 1) / page_size
Bootloader de deuxième niveau (n pages) n = (second_size + page_size - 1) / page_size
Récupération DTBO ou ACPIO (o pages) 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 l'image de démarrage version d'en-tête et chemins d'accès des images de superposition, consultez la section En-tête de l'image de démarrage Gestion des versions

Implémenter DTBO

Les appareils non-A/B exécutant la version 9 ou ultérieure peuvent remplir le champ Section recovery_dtbo de l'image de récupération. Pour inclure le recovery_dtbo dans recovery.img, sur l'appareil BoardConfig.mk:

  • 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 de l'image DTBO. Le système de compilation Android utilise la variable pour définir le l'argument recovery_dtbo de l'outil mkbootimg lors de la création de de l'image de récupération.

Si BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS et Les variables 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 autres qu'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 renseigner 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 l'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 permettre 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 le l'argument recovery_acpio de l'outil mkbootimg lors de la création de 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.