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