Sur les appareils non A/B, l'image de récupération doit contenir des informations provenant d'un blob d'arborescence de l'appareil (DTB) ou d'une image de superposition ACPI (Advanced Configuration and Power Interface). Lorsque ces appareils démarrent lors de la récupération, le bootloader peut ensuite charger l'image de superposition compatible avec l'image de récupération. 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 la section Implémenter les mises à jour A/B).
Les options d'inclusion d'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é avec GKI | Version de l'en-tête de démarrage (lancement des appareils) | 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 (est considéré comme 0) | N/A (est considéré comme 0) | Non |
non-A/B | N/A | N/A (est considéré comme 0) | N/A (est considéré comme 0) | Oui |
* Les appareils A/B exécutant Android 11 ou version ultérieure et utilisant l'image de kernel générique (GKI) doivent utiliser une version d'en-tête de démarrage principale de 3 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
etdtbo
) et basculent de l'un à l'autre pendant les mises à jour, ce qui évite d'avoir à disposer 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 qui démarrent avec Android 11 ou version ultérieure et qui utilisent une version de l'en-tête de démarrage 3 doivent spécifier explicitement une version de l'en-tête de démarrage 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 de superposition (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 empêcher la récupération de dépendre de la partition DTBO/ACPIO lors d'une mise à jour, les appareils non A/B équipés d'Android 9 ou version ultérieure peuvent spécifier une image de récupération DTBO/ACPIO contenant des informations de l'image de superposition dans une 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 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 autres que 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 |
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 |
DTBO de récupération ou ACPIO (pages o) | 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'image de superposition, consultez la section Gestion des versions de l'en-tête de l'image de démarrage.
Implémenter DTBO
Les appareils autres qu'A/B exécutant Android 9 ou version ultérieure peuvent renseigner la section recovery_dtbo
de l'image de récupération. Pour inclure l'image recovery_dtbo
dans recovery.img
, dans l'BoardConfig.mk
de l'appareil:
Définissez la configuration
BOARD_INCLUDE_RECOVERY_DTBO
surtrue
: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 l'argumentrecovery_dtbo
de l'outilmkbootimg
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 équipés d'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 l'BoardConfig.mk
de l'appareil:
Définissez la configuration
BOARD_INCLUDE_RECOVERY_ACPIO
surtrue
: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'argumentrecovery_acpio
de l'outilmkbootimg
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
.