Images de récupération

Sur les appareils non-A/B, l’image de récupération doit contenir des informations provenant d’une image de superposition blob d’arborescence de périphériques (DTB) ou d’une image de superposition Advanced Configuration and Power Interface (ACPI) . Lorsque ces appareils démarrent en mode récupération, le chargeur de démarrage peut alors charger l'image de superposition compatible avec l'image de récupération. Les appareils prenant en charge les mises à jour A/B (transparentes) doivent utiliser la récupération comme démarrage au lieu d'une partition de récupération distincte (pour plus de détails, voir Implémentation des mises à jour A/B ).

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

Libérer Schéma de mise à jour Conformité 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 UN B,
A/B virtuel
Oui 3 * N / A Non
UN 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) UN B N / A 2 0, 1, 2 Non
non-A/B N / A 2 0, 1, 2 Oui
9 (P) UN B N / A 1 0, 1 Non
non-A/B N / A 1 0, 1 Oui
8 (O) UN 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 Generic Kernel Image (GKI) doivent utiliser une version d'en-tête de démarrage principal de 3 pour être compatible avec la partition de démarrage du fournisseur .

Points clés:

  • Les périphériques A/B n'ont pas besoin de spécifier une 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 pendant les mises à jour, éliminant ainsi le besoin d'une image de récupération. Si vous le souhaitez, 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 d'en-tête de démarrage de 3 doivent spécifier explicitement une version d'en-tête de démarrage de 2 pour l'image de récupération séparément. Par exemple:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Pour les architectures qui ne prennent pas en charge les arborescences de périphériques, 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 pannes 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 de terminer la mise à jour complète), l'appareil tente de démarrer en mode de récupération pour terminer la mise à jour OTA. Cependant, comme la partition de superposition a déjà été mise à jour, une incohérence pourrait se produire avec l'image de récupération (qui n'a pas encore été mise à jour).

Pour empêcher la récupération de dépendre 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 les informations de l'image de superposition dans une section distincte dans le format de l'image de démarrage ( doit utiliser une version d'en-tête de démarrage de 1 ou 2).

Modifications de 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 de l'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
Disque RAM (m pages) m = ( ramdisk_size + page_size - 1) / page_size
Chargeur de démarrage de deuxième étape (n pages) n = ( second_size + page_size - 1) / page_size
Récupération DTBO ou ACPIO (pages o) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Pour plus de détails 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 de l'image de superposition, consultez Gestion des versions de l'en-tête de l'image de démarrage .

Implémentation de DTBO

Les appareils non-A/B exécutant 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 périphérique 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 build 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 définies correctement, le système de build Android inclut le DTBO spécifié par la variable BOARD_PREBUILT_DTBOIMAGE dans recovery.img .

Implémentation d'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 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 périphérique BoardConfig.mk :

  • 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 build 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 définies correctement, le système de build Android inclut l'ACPIO spécifié par la variable BOARD_RECOVERY_ACPIO dans recovery.img .