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.