Sur les appareils non A/B, l'image de restauration doit contenir des informations provenant d'un blob d'arborescence de périphériques (DTB) ou image de superposition ACPI (Advanced Configuration and Power Interface). Lorsque ces appareils démarrent en mode de récupération, le bootloader peut charger l'image de superposition compatible avec l'image de restauration. Les appareils compatibles avec les mises à jour A/B (sans interruption) 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 des 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 varient selon les versions d'Android.
| Version | 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 (appareils de mise à niveau) | Image de restauration 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 équipés d'Android 11 ou version ultérieure et utilisant l'image générique du noyau (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 restauration, car les mises à jour A/B utilisent deux ensembles de partitions (y compris
bootetdtbo) et basculent entre eux lors des mises à jour, ce qui élimine le besoin d'une image de restauration. Les appareils A/B peuvent toujours utiliser une image de restauration 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 restauration séparément. Exemple :
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2Pour les architectures qui ne sont pas compatibles avec les arborescences de périphériques, l'image de restauration 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 restauration 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 de récupération pour terminer la mise à jour OTA. Toutefois, comme la partition de superposition a déjà été mise à jour, une incompatibilité peut se produire avec l'image de restauration (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 équipés d'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 de l'image de démarrage
Pour permettre à l'image de restauration de contenir le DTBO ou l'ACPIO de récupération sur les appareils non A/B équipés d'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 |
| Kernel (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 ou ACPIO de récupération (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 la version de l'en-tête de l'image de démarrage
et les chemins d'accès à l'image 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 insérer la section recovery_dtbo de l'image de restauration. Pour inclure l'image recovery_dtbo dans recovery.img, dans le fichier BoardConfig.mk de l'appareil :
Définissez la configuration
BOARD_INCLUDE_RECOVERY_DTBOsurtrue:BOARD_INCLUDE_RECOVERY_DTBO := trueÉtendez la variable
BOARD_MKBOOTIMG_ARGSpour 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_DTBOIMAGEest définie sur le chemin d'accès à l'image DTBO. Le système de compilation Android utilise la variable pour définir l'argumentrecovery_dtbode l'outilmkbootimglors de la création de l'image de restauration.
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 restauration. Pour inclure l'image recovery_acpio dans recovery.img, dans le fichier BoardConfig.mk de l'appareil :
Définissez la configuration
BOARD_INCLUDE_RECOVERY_ACPIOsurtrue:BOARD_INCLUDE_RECOVERY_ACPIO := trueÉtendez la variable
BOARD_MKBOOTIMG_ARGSpour 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 être compatible avec l'ACPIO de récupération.BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)Assurez-vous que la variable
BOARD_RECOVERY_ACPIOest définie sur le chemin d'accès à l'image ACPIO. Le système de compilation Android utilise la variable pour définir l'argumentrecovery_acpiode l'outilmkbootimglors de la création de l'image de restauration.
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.