Em dispositivos não A/B, a imagem de recuperação precisa conter informações de um blob da árvore de dispositivos (DTB) ou de uma imagem de sobreposição da Interface de configuração e energia avançada (ACPI). Quando esses dispositivos são inicializados na recuperação, o carregador de inicialização pode carregar a imagem de sobreposição compatível com a imagem de recuperação. Os dispositivos que oferecem suporte a atualizações A/B (contínuas) precisam usar a recuperação como inicialização em vez de uma partição de recuperação separada. Para mais detalhes, consulte Implementação de atualizações A/B.
As opções para incluir um DTBO/ACPIO de recuperação como parte da imagem de inicialização/recuperação são diferentes entre as versões do Android.
| Versão | Atualizar esquema | Conformidade com a GKI | Versão do cabeçalho de inicialização (dispositivos de lançamento) | Versão do cabeçalho de inicialização (dispositivos em upgrade) | É necessário ter uma imagem de recuperação dedicada | 
|---|---|---|---|---|---|
| 11 | A/B, A/B virtual | Sim | 3* | N/A | Não | 
| A/B, A/B virtual | Não | 2, 3 | 0, 1, 2, 3 | Não | |
| não A/B | Sim | 3 | N/A | Sim | |
| não A/B | Não | 2, 3 | 0, 1, 2, 3 | Sim | |
| 10 (Q) | A/B | N/A | 2 | 0, 1, 2 | Não | 
| não A/B | N/A | 2 | 0, 1, 2 | Sim | |
| 9 (P) | A/B | N/A | 1 | 0, 1 | Não | 
| não A/B | N/A | 1 | 0, 1 | Sim | |
| 8 (O) | A/B | N/A | N/A (considerado 0) | N/A (considerado 0) | Não | 
| não A/B | N/A | N/A (considerado 0) | N/A (considerado 0) | Sim | 
* Dispositivos A/B com Android 11 ou versões mais recentes e que usam a Imagem genérica do kernel (GKI) precisam usar um cabeçalho de inicialização principal da versão 3 para serem compatíveis com a partição de inicialização do fornecedor.
Pontos importantes:
- Os dispositivos A/B não precisam especificar uma imagem de recuperação, já que as atualizações A/B usam dois conjuntos de partições (incluindo - boote- dtbo) e alternam entre eles durante as atualizações, removendo a necessidade de uma imagem de recuperação. Os dispositivos A/B ainda podem usar uma imagem de recuperação dedicada.
- Dispositivos não A/B lançados com o Android 11 ou versões mais recentes e que usam uma versão 3 do cabeçalho de inicialização precisam especificar explicitamente uma versão 2 do cabeçalho de inicialização para a imagem de recuperação separadamente. Exemplo: - BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
- Para arquiteturas que não oferecem suporte a árvores de dispositivos, a imagem de recuperação pode incluir uma imagem ACPIO em vez de uma imagem DTBO. 
Sobre falhas de OTA e imagens de recuperação
Para evitar falhas de atualização over-the-air (OTA) em dispositivos não A/B, a imagem de recuperação precisa ser autossuficiente e independente de outras imagens. Durante uma atualização OTA, se um problema ocorrer depois que a imagem de sobreposição for atualizada (mas antes de concluir a atualização completa), o dispositivo tentará inicializar no modo de recuperação para concluir a atualização OTA. No entanto, como a partição de sobreposição já foi atualizada, pode ocorrer uma incompatibilidade com a imagem de recuperação, que ainda não foi atualizada.
Para evitar que a recuperação dependa da partição DTBO/ACPIO durante uma atualização, os dispositivos não A/B com Android 9 ou mais recente podem especificar uma imagem DTBO/ACPIO de recuperação que contenha informações da imagem de sobreposição como uma seção separada no formato de imagem de inicialização (é necessário usar uma versão 1 ou 2 do cabeçalho de inicialização).
Mudanças na imagem de inicialização
Para permitir que a imagem de recuperação contenha o DTBO ou ACPIO de recuperação em dispositivos não A/B com Android 9 ou mais recente, atualize a estrutura da imagem de inicialização da seguinte maneira.
| Seção de imagem de inicialização | Número de páginas | 
|---|---|
| Cabeçalho de inicialização (1 página) | 1 | 
| Kernel (l páginas) | l = ( kernel_size+page_size-
   1) /page_size | 
| Ramdisk (páginas m) | m = ( ramdisk_size+page_size-
   1) /page_size | 
| Carregador de inicialização de segundo estágio (n páginas) | n = ( second_size+page_size-
   1) /page_size | 
| DTBO ou ACPIO de recuperação (páginas o) | o = ( recovery_[dtbo|acpio]_size+page_size-
   1) /page_size | 
Para detalhes sobre os argumentos da ferramenta mkbootimg para especificar a versão do cabeçalho da imagem de inicialização e os caminhos da imagem de sobreposição, consulte Controle de versões do cabeçalho da imagem de inicialização.
Implementar DTBO
Dispositivos não A/B com o Android 9 ou versões mais recentes podem preencher a seção
recovery_dtbo da imagem de recuperação. Para incluir a imagem do recovery_dtbo
em recovery.img, no dispositivo BoardConfig.mk:
- Defina a configuração - BOARD_INCLUDE_RECOVERY_DTBOcomo- true:- BOARD_INCLUDE_RECOVERY_DTBO := true
- Estenda a variável - BOARD_MKBOOTIMG_ARGSpara especificar a versão do cabeçalho da imagem de inicialização:- BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
- Verifique se a variável - BOARD_PREBUILT_DTBOIMAGEestá definida como o caminho da imagem DTBO. O sistema de build do Android usa a variável para definir o argumento- recovery_dtboda ferramenta- mkbootimgdurante a criação da imagem de recuperação.
Se as variáveis BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS e BOARD_PREBUILT_DTBOIMAGE estiverem definidas corretamente, o sistema de build do Android vai incluir o DTBO especificado pela variável BOARD_PREBUILT_DTBOIMAGE em recovery.img.
Implementar o ACPIO
Dispositivos não A/B com Android 9 ou mais recente podem usar
uma imagem de sobreposição ACPIO (em vez de uma imagem DTBO) e preencher a
seção recovery_acpio (em vez da seção recovery_dtbo) da
imagem de recuperação. Para incluir a imagem recovery_acpio em recovery.img, no
BoardConfig.mk do dispositivo:
- Defina a configuração - BOARD_INCLUDE_RECOVERY_ACPIOcomo- true:- BOARD_INCLUDE_RECOVERY_ACPIO := true
- Estenda a variável - BOARD_MKBOOTIMG_ARGSpara especificar a versão do cabeçalho da imagem de inicialização. A variável precisa ser maior ou igual a 1 para oferecer suporte à recuperação ACPIO.- BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
- Verifique se a variável - BOARD_RECOVERY_ACPIOestá definida como o caminho da imagem ACPIO. O sistema de compilação do Android usa a variável para definir o argumento- recovery_acpioda ferramenta- mkbootimgdurante a criação da imagem de recuperação.
Se as variáveis BOARD_INCLUDE_RECOVERY_ACPIO, BOARD_MKBOOTIMG_ARGS e BOARD_RECOVERY_ACPIO estiverem definidas corretamente, o sistema de build do Android vai incluir o ACPIO especificado pela variável BOARD_RECOVERY_ACPIO em recovery.img.
