O SDV segue a abordagem padrão do Android de atualizações do sistema A/B (contínuas). A documentação do AOSP se aplica principalmente ao SDV. Esta página detalha o uso específico para SDV e caminhos conhecidos para criar e aplicar pacotes de atualização.
O SDV está configurado para usar atualizações A/B não virtuais. Para configurar e acionar atualizações
A/B para uma partição /oem_ab personalizada de um pacote de serviços, consulte
Atualizações de partição AB do OEM.
Implementar a HAL de controle de inicialização
A imagem do SDV Core 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 carregadores de inicialização 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. Use o bootctl incluído nas imagens SDV de depuração (eng
e userdebug) 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 pequenos desvios.
Atualização completa
Na raiz do repositório:
source build/envsetup.sh && lunch sdv_core_cf-aosp_current-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, 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 invocação de ota_from_target_files que no 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. As versões de depuração de 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.
Também para o APEX, o SDV segue os conceitos do Android em relação à 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 atualizações do sistema e:
- A versão declarada é maior que a versão 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 é mais recente que a versão na lista de bloqueio, se listada.
O SDV geralmente é implantado em vários sistemas em uma rede. Portanto, é preciso 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.
Também é fundamental atualizar a rede como um todo, o que exige que as atualizações dos pacotes de serviços sejam implantadas em todas as máquinas ao mesmo tempo ou que não contenham alterações 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 reconciliar mudanças feitas em interfaces, além das 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 acidentalmente em um estado insatisfatório, podemos recuperar o último estado satisfatório conhecido.