Immagini di ripristino

Sui dispositivi non A/B, l'immagine di ripristino deve contenere informazioni da un BLOB della struttura dei dispositivi (DTB) o da un'immagine sovrapposta ACPI (Advanced Configuration and Power Interface) . Quando tali dispositivi si avviano in modalità di ripristino, il bootloader può caricare l'immagine sovrapposta compatibile con l'immagine di ripristino. I dispositivi che supportano gli aggiornamenti A/B (senza interruzioni) devono utilizzare il ripristino come avvio anziché una partizione di ripristino separata (per i dettagli, vedere Implementazione degli aggiornamenti A/B ).

Le opzioni per includere un DTBO/ACPIO di ripristino come parte dell'immagine di avvio/ripristino differiscono tra le versioni Android.

Pubblicazione Schema di aggiornamento Conformità GKI Versione dell'intestazione di avvio (dispositivi di avvio) Versione dell'intestazione di avvio (aggiornamento dei dispositivi) È richiesta un'immagine di ripristino dedicata
11 A/B,
A/B virtuale
3 * N / A NO
A/B,
A/B virtuale
NO 2, 3 0, 1, 2, 3 NO
non A/B 3 N / A
non A/B NO 2, 3 0, 1, 2, 3
10 (Q) A/B N / A 2 0, 1, 2 NO
non A/B N / A 2 0, 1, 2
9 (P) A/B N / A 1 0, 1 NO
non A/B N / A 1 0, 1
8 (O) A/B N / A N/A (considerato 0) N/A (considerato 0) NO
non A/B N / A N/A (considerato 0) N/A (considerato 0)

* I dispositivi A/B che eseguono Android 11 o versioni successive e utilizzano l' immagine generica del kernel (GKI) devono utilizzare un'intestazione di avvio primaria versione 3 per essere compatibili con la partizione di avvio del fornitore .

Punti chiave:

  • I dispositivi A/B non hanno bisogno di specificare un'immagine di ripristino poiché gli aggiornamenti A/B utilizzano due set di partizioni (inclusi boot e dtbo ) e passano da una all'altra durante gli aggiornamenti, eliminando la necessità di un'immagine di ripristino. Se lo si desidera, i dispositivi A/B possono comunque utilizzare un'immagine di ripristino dedicata.

  • I dispositivi non A/B che vengono avviati con Android 11 o versioni successive e utilizzano una versione dell'intestazione di avvio pari a 3 devono specificare esplicitamente separatamente una versione dell'intestazione di avvio pari a 2 per l'immagine di ripristino. Per esempio:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Per le architetture che non supportano le strutture dei dispositivi, l'immagine di ripristino può includere un'immagine ACPIO anziché un'immagine DTBO.

Informazioni sugli errori OTA e sulle immagini di ripristino

Per prevenire errori over-the-air (OTA) su dispositivi non A/B, l'immagine di ripristino deve essere autosufficiente e indipendente dalle altre immagini. Durante un aggiornamento OTA, se si verifica un problema dopo l'aggiornamento dell'immagine sovrapposta (ma prima del completamento dell'aggiornamento completo), il dispositivo tenta di avviarsi in modalità di ripristino per completare l'aggiornamento OTA. Tuttavia, poiché la partizione sovrapposta è già stata aggiornata, potrebbe verificarsi una mancata corrispondenza con l'immagine di ripristino (che non è stata ancora aggiornata).

Per evitare che il ripristino dipenda dalla partizione DTBO/ACPIO durante un aggiornamento, i dispositivi non A/B con Android 9 o versioni successive possono specificare un'immagine DTBO/ACPIO di ripristino contenente informazioni dall'immagine sovrapposta come sezione separata nel formato dell'immagine di avvio ( deve utilizzare una versione dell'intestazione di avvio 1 o 2).

Modifiche all'immagine di avvio

Per consentire all'immagine di ripristino di contenere il DTBO o ACPIO di ripristino su dispositivi non A/B con Android 9 o versioni successive, aggiornare la struttura dell'immagine di avvio come segue.

Sezione immagine di avvio Numero di pagine
Intestazione di avvio (1 pagina) 1
Kernel (l pagine) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (m pagine) m = ( ramdisk_size + page_size - 1) / page_size
Bootloader di seconda fase (n pagine) n = ( second_size + page_size - 1) / page_size
Ripristino DTBO o ACPIO (o pagine) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Per dettagli sugli argomenti dello strumento mkbootimg per specificare la versione dell'intestazione dell'immagine di avvio e i percorsi delle immagini sovrapposte, consulta Controllo delle versioni dell'intestazione dell'immagine di avvio .

Implementazione del DTBO

I dispositivi non A/B con versione 9 o successiva possono popolare la sezione recovery_dtbo dell'immagine di ripristino. Per includere l'immagine recovery_dtbo in recovery.img , nel dispositivo BoardConfig.mk :

  • Imposta la configurazione BOARD_INCLUDE_RECOVERY_DTBO su true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Estendi la variabile BOARD_MKBOOTIMG_ARGS per specificare la versione dell'intestazione dell'immagine di avvio:

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Assicurati che la variabile BOARD_PREBUILT_DTBOIMAGE sia impostata sul percorso dell'immagine DTBO. Il sistema di build Android utilizza la variabile per impostare l'argomento recovery_dtbo dello strumento mkbootimg durante la creazione dell'immagine di ripristino.

Se le variabili BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS e BOARD_PREBUILT_DTBOIMAGE sono impostate correttamente, il sistema di build Android include il DTBO specificato dalla variabile BOARD_PREBUILT_DTBOIMAGE in recovery.img .

Implementazione dell'ACPIO

I dispositivi non A/B che eseguono Android 9 o versioni successive possono utilizzare un'immagine overlay ACPIO (invece di un'immagine DTBO) e possono popolare la sezione recovery_acpio (invece della sezione recovery_dtbo ) dell'immagine di ripristino. Per includere l'immagine recovery_acpio in recovery.img , nel dispositivo BoardConfig.mk :

  • Imposta la configurazione BOARD_INCLUDE_RECOVERY_ACPIO su true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Estendi la variabile BOARD_MKBOOTIMG_ARGS per specificare la versione dell'intestazione dell'immagine di avvio. La variabile deve essere maggiore o uguale a 1 per supportare il ripristino ACPIO.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Assicurarsi che la variabile BOARD_RECOVERY_ACPIO sia impostata sul percorso dell'immagine ACPIO. Il sistema di build Android utilizza la variabile per impostare l'argomento recovery_acpio dello strumento mkbootimg durante la creazione dell'immagine di ripristino.

Se le variabili BOARD_INCLUDE_RECOVERY_ACPIO , BOARD_MKBOOTIMG_ARGS e BOARD_RECOVERY_ACPIO sono impostate correttamente, il sistema di build Android include l'ACPIO specificato dalla variabile BOARD_RECOVERY_ACPIO in recovery.img .