Atualizações do sistema A/B

O SDV segue a abordagem padrão do Android de atualizações do sistema A/B (ininterruptas). A documentação do AOSP se aplica principalmente ao SDV. Esta página detalha o uso específico do SDV e os caminhos conhecidos para criar e aplicar pacotes de atualização.

No momento, o SDV está configurado para usar atualizações A/B não virtuais.

Implementar a HAL de controle de inicialização

A imagem principal do SDV para Cuttlefish (sdv_core_cf) oferece uma implementação padrão da HAL de controle de inicialização com base em hardware/interfaces/boot/aidl/default/. Outros bootloaders precisam implementar a HAL para oferecer suporte a atualizações A/B.

Consulte a seção Implementar a HAL de controle de inicialização da documentação do AOSP para mais detalhes. Você pode usar o bootctl incluído nas imagens de depuração (eng e userdebug) do SDV para testar a implementação.

Gerar um pacote OTA

Para saber mais, consulte: Criar pacotes OTA. As instruções nesta página seguem a documentação do AOSP com pequenas variações.

Atualização completa

Na raiz do repositório:

source build/envsetup.sh && lunch sdv_core_cf-trunk_staging-userdebug
mkdir dist_output
m dist DIST_DIR=dist_output

Esses comandos produzem arquivos de destino no diretório dist_output. Para builds locais de sdv_core_cf, esse valor é normalmente sdv_core_cf-target_files-$USER.zip.

Para produzir um pacote OTA, use ota_from_target_files. Ao contrário do AOSP, o pacote não é criado como parte de m dist.

m ota_from_target_files
ota_from_target_files \
  dist_output/sdv_core_cf-target_files-$USER.zip \
  ota_update.zip

Atualização incremental

Mesma ota_from_target_files invocação que em AOSP:

ota_from_target_files \
  -i PREVIOUS-sdv_core_cf-target_files.zip \
  dist_new/sdv_core_cf-target_files-$USER.zip \
  incremental_ota_update.zip

Instalar um pacote OTA

As atualizações são instaladas usando o serviço update_engine. Os builds de depuração do SDV incluem update_engine_client, que pode ser usado para depurar e testar o processo de atualização.

Para instalar um pacote OTA, execute:

system/update_engine/scripts/update_device.py ota_update.zip

Se a atualização for instalada corretamente (o status final é UPDATE_STATUS_UPDATED_NEED_REBOOT e o resultado é ErrorCode::kSuccess), ela será ativada na próxima reinicialização.

Controle de versões

Para atualizações do sistema, o SDV usa os metadados do pacote OTA do Android para determinar se um pacote OTA atende aos requisitos e pode ser instalado.

Além disso, para o APEX, o SDV segue os conceitos do Android sobre capacidade de atualização. Portanto, um APEX pode ser atualizado quando não é um APEX de inicialização. O APEX de inicialização precisa ser atualizado por meio de atualizações do sistema e:

  • A versão declarada é maior que a pré-instalada, e ambas são maiores ou iguais a 1,

ou

  • A versão declarada é um APEX não pré-instalado e a versão é maior que a versão na lista de bloqueio, se listada.

O SDV normalmente é implantado em vários sistemas em uma rede. Portanto, é necessário garantir que as atualizações feitas em um único sistema sejam executadas corretamente. No entanto, esse cuidado não garante que todos os sistemas possam se comunicar corretamente.

É igualmente importante atualizar a rede geral, o que exige que as atualizações dos pacotes de serviço sejam implantadas em todas as máquinas ao mesmo tempo ou que as atualizações não contenham mudanças interruptivas. Por exemplo, mudanças incompatíveis na interface.

Embora o SDV não ofereça ferramentas para detectar mudanças incompatíveis, nossas diretrizes descrevem como conciliar as mudanças feitas nas interfaces, bem como as práticas recomendadas necessárias para implantar as mudanças.

Além disso, o SDV oferece suporte a mecanismos de reversão para atualizações do sistema e do APEX. Se o sistema entrar involuntariamente em um estado insatisfatório, podemos recuperar o último estado satisfatório conhecido.