Imagens de recuperação

Em dispositivos não A/B, a imagem de recuperação deve conter informações de um blob de árvore de dispositivos (DTB) ou de uma imagem de sobreposição de configuração avançada e interface de energia (ACPI) . Quando esses dispositivos inicializam 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 suportam atualizações A/B (contínuas) devem usar a recuperação como inicialização em vez de uma partição de recuperação separada (para obter 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 diferem entre as versões do Android.

Liberar Esquema de atualização Conformidade com GKI Versão do cabeçalho de inicialização (dispositivos de inicialização) Versão do cabeçalho de inicialização (atualização de dispositivos) É necessária uma imagem de recuperação dedicada
11 A/B,
A/B virtuais
Sim 3 * N / D Não
A/B,
A/B virtuais
Não 2, 3 0, 1, 2, 3 Não
não-A/B Sim 3 N / D Sim
não-A/B Não 2, 3 0, 1, 2, 3 Sim
10 (Q) A/B N / D 2 0, 1, 2 Não
não-A/B N / D 2 0, 1, 2 Sim
9 (P) A/B N / D 1 0, 1 Não
não-A/B N / D 1 0, 1 Sim
8 (O) A/B N / D N/A (considerado 0) N/A (considerado 0) Não
não-A/B N / D N/A (considerado 0) N/A (considerado 0) Sim

* Dispositivos A/B que executam o Android 11 ou superior e usam a imagem genérica do kernel (GKI) devem usar uma versão 3 do cabeçalho de inicialização principal para serem compatíveis com a partição de inicialização do fornecedor .

Pontos chave:

  • Os dispositivos A/B não precisam especificar uma imagem de recuperação, pois as atualizações A/B usam dois conjuntos de partições (incluindo boot e dtbo ) e alternam entre eles durante as atualizações, eliminando a necessidade de uma imagem de recuperação. Se desejar, os dispositivos A/B ainda podem usar uma imagem de recuperação dedicada.

  • Dispositivos não A/B iniciados com Android 11 ou superior e que usam uma versão de cabeçalho de inicialização 3 devem especificar explicitamente uma versão de cabeçalho de inicialização 2 para a imagem de recuperação separadamente. Por exemplo:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Para arquiteturas que não suportam árvores de dispositivos, a imagem de recuperação pode incluir uma imagem ACPIO em vez de uma imagem DTBO.

Sobre falhas OTA e imagens de recuperação

Para evitar falhas over-the-air (OTA) em dispositivos não A/B, a imagem de recuperação deve ser autossuficiente e independente de outras imagens. Durante uma atualização OTA, se ocorrer um problema após a atualização da imagem de sobreposição (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, poderá 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, dispositivos não A/B executando Android 9 ou superior podem especificar uma imagem DTBO/ACPIO de recuperação contendo informações da imagem de sobreposição como uma seção separada no formato da imagem de inicialização ( deve usar uma versão de cabeçalho de inicialização 1 ou 2).

Alterações 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 que executam o Android 9 ou superior, 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 (m páginas) m = ( ramdisk_size + page_size - 1) / page_size
Bootloader de segundo estágio (n páginas) n = ( second_size + page_size - 1) / page_size
Recuperação DTBO ou ACPIO (o páginas) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

Para obter 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ão do cabeçalho da imagem de inicialização .

Implementando DTBO

Dispositivos não A/B executando 9 ou superior podem preencher a seção recovery_dtbo da imagem de recuperação. Para incluir a imagem recovery_dtbo em recovery.img , no dispositivo BoardConfig.mk :

  • Defina a configuração BOARD_INCLUDE_RECOVERY_DTBO como true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Estenda a variável BOARD_MKBOOTIMG_ARGS para 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)
    
  • Certifique-se de que a variável BOARD_PREBUILT_DTBOIMAGE esteja configurada para o caminho da imagem DTBO. O sistema de compilação do Android usa a variável para definir o argumento recovery_dtbo da ferramenta mkbootimg durante 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 compilação do Android incluirá o DTBO especificado pela variável BOARD_PREBUILT_DTBOIMAGE em recovery.img .

Implementando ACPIO

Dispositivos não A/B que executam o Android 9 ou superior podem usar uma imagem de sobreposição ACPIO (em vez de uma imagem DTBO) e podem 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 dispositivo BoardConfig.mk :

  • Defina a configuração BOARD_INCLUDE_RECOVERY_ACPIO como true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Estenda a variável BOARD_MKBOOTIMG_ARGS para especificar a versão do cabeçalho da imagem de inicialização. A variável deve ser maior ou igual a 1 para suportar ACPIO de recuperação.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • Certifique-se de que a variável BOARD_RECOVERY_ACPIO esteja configurada para o caminho da imagem ACPIO. O sistema de compilação do Android usa a variável para definir o argumento recovery_acpio da ferramenta mkbootimg durante 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 compilação do Android incluirá o ACPIO especificado pela variável BOARD_RECOVERY_ACPIO em recovery.img .