Adiar atualizações de dispositivos
Importante
Esta é a documentação do Azure Sphere (Legado). O Azure Sphere (Legado) 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 atualizações para o sistema operacional Azure Sphere e para imagens de aplicativos para impedir que a atualização interrompa o processamento crítico. Um dispositivo Azure Sphere em um aparelho de cozinha, por exemplo, pode adiar atualizações durante o uso. Para ter a oportunidade de adiar atualizações, o aplicativo se registra para notificações de atualização. Depois que o sistema operacional baixa a atualização, ele notifica o aplicativo, que pode obter detalhes sobre a atualização e solicitar o adiamento.
O exemplo de Atualização Adiada mostra como usar um loop de eventos e eventos do sistema para adiar atualizações.
Aplicativos compatíveis em tempo real (RTApps) não podem receber notificações de atualização ou solicitar adiamentos. Um aplicativo de alto nível é responsável por gerenciar o adiamento de atualização em nome do RTApps no dispositivo.
Requisitos de diferimento
Os aplicativos que adiam atualizações devem incluir os arquivos de cabeçalho apropriados e adicionar 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 de 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 como 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 como true
para permitir que o aplicativo adie e retome atualizações.
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ção por meio de um mecanismo de notificação de evento e loop de eventos. O aplicativo cria um EventLoop
, que é um objeto de thread único através do qual o aplicativo é notificado de eventos pendentes.
Para receber notificações, um aplicativo chama SysEvent_RegisterForEventNotifications, passando estes parâmetros:
- Um ponteiro para o loop de eventos
- Um
eventBitmask
que especifica os eventos para os quais o aplicativo solicita 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
Apenas um EventLoop
objeto pode ser usado com SysEvent_RegisterForEventNotifications por thread. Uma segunda chamada para SysEvent_RegisterForEventNotifications com um objeto diferente EventLoop
falhará.
Após o registro, o aplicativo chama EventLoop_Run, que invoca a função de retorno de chamada se um evento tiver mudado de status. 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 é uma atualização do sistema operacional ou do aplicativo e por quanto tempo a atualização pode ser adiada. O aplicativo pode determinar como lidar com a notificação de evento.
O Azure Sphere pode enviar várias notificações de status para cada evento de atualização:
Status | Description |
---|---|
SysEvent_Status_Pending | Um aviso de 10 segundos de que ocorrerá um evento de atualização, com a oportunidade de adiar. |
SysEvent_Status_Final | Um aviso de 10 segundos de que ocorrerá um evento de atualização, sem a oportunidade de adiamento. |
SysEvent_Status_Deferred | O evento anteriormente pendente foi adiado e ocorrerá mais tarde. |
SysEvent_Status_Complete | O processo de atualização de software está concluído. Esta notificação de evento é enviada apenas para atualizações de aplicativos. |
Um aplicativo só pode solicitar o adiamento depois de receber uma notificação de 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 1440 minutos (24 horas). Para uma atualização de aplicativo, o período máximo de adiamento é 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 sistema operacional, uma chamada bem-sucedida para SysEvent_ResumeEvent reinicia o processo de notificação e, portanto, envia uma nova notificação de SysEvent_Status_Pending . O aplicativo não deve ligar para SysEvent_DeferEvent novamente até que tenha recebido essa notificação.
Quando o aplicativo recebe a notificação de SysEvent_Status_Final , ele deve se preparar para receber um sinal SIGTERM do sistema operacional Azure Sphere. Quando o sinal SIGTERM é recebido, o aplicativo deve executar a limpeza final e sair. O pedido não deve sair antes do recebimento do SIGTERM; caso contrário, poderia ser reiniciado antes do envio do SIGTERM. 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. Atualmente, a notificação do aplicativo não especifica qual aplicativo está sendo atualizado.
Quando a notificação não é mais necessária, o aplicativo deve chamar SysEvent_UnregisterForEventNotifications e, em seguida, EventLoop_Close liberar a memória alocada para o objeto de loop de evento. Observe que, depois que todas as notificações de eventos forem canceladas, o aplicativo poderá usar um novo EventLoop
objeto.