Sur les périphériques non A/B, l'image de récupération doit contenir des informations provenant d'une image de superposition d'un blob d'arborescence de périphériques (DTB) ou d'une interface de configuration et d'alimentation avancées (ACPI) . Lorsque ces périphériques démarrent en 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 qui prennent 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/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 (périphériques 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 une 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 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, supprimant 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 supérieur 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 périphériques non A/B, l'image de récupération doit être autosuffisante 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. Cependant, étant donné que la partition de superposition a déjà été mise à jour, une incompatibilité 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 exécutant Android 9 ou supérieur peuvent spécifier une image DTBO/ACPIO de récupération contenant des informations de l'image de superposition dans une section distincte du 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 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 supérieur, 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 |
Disque virtuel (m pages) | m = ( ramdisk_size + page_size - 1) / page_size |
Bootloader de deuxième étape (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 plus d'informations 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 .
Mise en œuvre du DTBO
Les périphériques non A/B exécutant 9 ou une 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 génération 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 BOARD_INCLUDE_RECOVERY_DTBO
, BOARD_MKBOOTIMG_ARGS
et BOARD_PREBUILT_DTBOIMAGE
sont définies correctement, le système de génération Android inclut le DTBO spécifié par la variable BOARD_PREBUILT_DTBOIMAGE
dans recovery.img
.
Mise en œuvre de l'ACPIO
Les appareils non-A/B exécutant Android 9 ou supérieur peuvent utiliser une image de superposition ACPIO (au lieu d'une image DTBO) et peuvent 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 génération 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 BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
et BOARD_RECOVERY_ACPIO
sont définies correctement, le système de construction Android inclut l'ACPIO spécifié par la variable BOARD_RECOVERY_ACPIO
dans recovery.img
.