Adiar atualizações do dispositivo
Importante
Esta é a documentação do Azure Sphere (herdado). O Azure Sphere (herdado) será desativado em 27 de setembro de 2027 e os usuários devem migrar para o Azure Sphere (integrado) até esse momento. Use o seletor de versão localizado acima do sumário para exibir a documentação do Azure Sphere (Integrado).
Um aplicativo de alto nível pode adiar temporariamente as atualizações para o sistema operacional Azure Sphere e para as imagens de aplicativo para impedir que a atualização interrompa o processamento crítico. Um dispositivo Azure Sphere em um dispositivo de cozinha, por exemplo, pode adiar as atualizações durante o uso. Para ter a oportunidade de adiar atualizações, o aplicativo registra-se para receber notificações de atualizações. Depois que o sistema operacional baixa a atualização, ele notifica o aplicativo, que pode obter detalhes sobre a atualização e solicitar um adiamento.
A amostra Atualização Adiada descreve como usar um loop de eventos e eventos do sistema para adiar atualizações.
RTApps (aplicativos com capacidade para tempo real) não podem receber notificações de atualização nem solicitar adiamentos. Um aplicativo de alto nível é responsável por gerenciar o adiamento de atualizações em nome de RTApps no dispositivo.
Requisitos para adiamentos
Os aplicativos que adiam as atualizações precisam incluir os arquivos de cabeçalho apropriados e adicionar as configurações de adiamento ao manifesto do aplicativo.
Arquivos de cabeçalho
Inclua os cabeçalhos EventLoop e SysEvent em seu projeto:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
Configurações do manifesto do aplicativo
Para ser notificado sobre eventos de atualização de software e ter a oportunidade de adiar essas atualizações, um aplicativo inclui dois recursos no arquivo de manifesto do aplicativo:
- SystemEventNotifications
- SoftwareUpdateDeferral
Defina o campo SystemEventNotifications para true
no arquivo app_manifest.json para receber notificações de eventos de atualização do sistema. O aplicativo também deve se registrar para notificações de eventos, conforme descrito em Mecanismo de notificação. Defina SoftwareUpdateDeferral para true
a fim de habilitar o aplicativo a adiar e retomar as atualizações.
O exemplo a seguir mostra as configurações de app_manifest.json necessárias para habilitar a notificação e o adiamento:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
Mecanismo de notificação
O Azure Sphere dá suporte ao adiamento de atualizações por meio de um mecanismo de notificação de eventos e loop de eventos. O aplicativo cria um EventLoop
, que é um objeto de thread único por meio do qual o aplicativo é notificado sobre eventos pendentes.
Para receber notificações, um aplicativo chama SysEvent_RegisterForEventNotifications, passando estes parâmetros:
- Um ponteiro para o loop de eventos
- Uma
eventBitmask
que especifica os eventos para os quais o aplicativo solicita uma notificação - Um ponteiro para uma função de retorno de chamada definida pelo aplicativo
- Um ponteiro de contexto opcional que é passado para o retorno de chamada
Somente um objeto EventLoop
pode ser usado com SysEvent_RegisterForEventNotifications por thread. Uma segunda chamada para SysEvent_RegisterForEventNotifications com um objeto EventLoop
diferente falhará.
Após o registro, o aplicativo chama EventLoop_Run, que invoca a função de retorno de chamada se o status de algum evento tiver sofrido alguma alteração. A função de retorno de chamada recebe um valor SysEvent_Events, que identifica o tipo de evento. Por sua vez, o retorno de chamada chama SysEvent_Info_GetUpdateData para descobrir se o evento é um sistema operacional ou uma atualização do aplicativo e por quanto tempo a atualização pode ser adiada. O aplicativo pode, então, determinar como tratar a notificação de eventos.
Azure Sphere pode enviar várias notificações de status para cada evento de atualização:
Status | Descrição |
---|---|
SysEvent_Status_Pending | Um aviso de dez segundos de que um evento de atualização ocorrerá, com a oportunidade de adiá-lo. |
SysEvent_Status_Final | Um aviso de dez segundos de que um evento de atualização ocorrerá, sem a oportunidade de adiamento. |
SysEvent_Status_Deferred | O evento pendente anterior foi adiado e ocorrerá mais tarde. |
SysEvent_Status_Complete | O processo de atualização de software foi concluído. Essa notificação de evento é enviada somente para atualizações do aplicativo. |
Um aplicativo pode solicitar adiamento somente depois de receber uma notificação SysEvent_Status_Pending. Para permitir que a atualização ocorra imediatamente, o aplicativo pode ignorar a notificação.
Para adiar a atualização, o aplicativo chama SysEvent_DeferEvent, passando o número de minutos para adiar a atualização. Para uma atualização do sistema operacional, o adiamento máximo é de 1.440 minutos (24 horas). Para uma atualização de aplicativo, o adiamento máximo é de 10.020 minutos (167 horas).
Um aplicativo pode encerrar um adiamento de atualização prematuramente chamando SysEvent_ResumeEvent. Para uma atualização de aplicativo ou de sistema operacional, uma chamada bem-sucedida para SysEvent_ResumeEvent reinicia o processo de notificação e, assim, envia uma nova notificação SysEvent_Status_Pending. O aplicativo não deverá chamar SysEvent_DeferEvent novamente até que tenha recebido uma notificação desse tipo.
Quando o aplicativo recebe a notificação SysEvent_Status_Final , ele deve se preparar para receber um sinal SIGTERM do sistema operacional do Azure Sphere. Quando o sinal SIGTERM é recebido, o aplicativo deve executar a limpeza final e sair. O aplicativo não deve sair antes do recebimento do SIGTERM; caso contrário, ele pode ser reiniciado antes que o SIGTERM seja enviado. Para uma atualização do sistema operacional, o aplicativo deve fazer qualquer limpeza necessária antes da reinicialização do dispositivo. Para uma atualização de aplicativo, o aplicativo de alto nível deve fazer o que for necessário antes que ele ou qualquer outro aplicativo no dispositivo seja reiniciado. A notificação de aplicativo não especifica atualmente qual aplicativo está sendo atualizado.
Quando a notificação não for mais necessária, o aplicativo deverá chamar SysEvent_UnregisterForEventNotifications e, em seguida, EventLoop_Close para liberar a memória alocada para o objeto de loop de eventos. Observe que, depois que o registro de todas as notificações de evento tiver sido cancelado, o aplicativo poderá usar um novo objeto EventLoop
.