Detecção de horário da rede

Os dispositivos Android tentam receber automaticamente o horário de época correto do Unix de uma fonte de rede. O Android usa o protocolo SNTP, que usa o protocolo UDP, para receber informações de horário.

Os componentes descritos nesta página fazem parte do sistema de detecção automática de tempo conhecido como origem do horário da rede. Um sinal de tempo de um servidor de horário de rede pode ser usado para definir o relógio do sistema do dispositivo Android quando a detecção de tempo automático é compatível com o dispositivo e o serviço time_detector está configurado para usá-lo.

Por padrão, o Android usa a origem de tempo da rede como a origem principal de detecção automática de tempo.

Sistema de detecção de tempo de rede

O serviço network_time_update_service executado no servidor do sistema Android implementa o sistema de detecção de tempo de rede. O serviço usa SNTP periodicamente para receber um sinal de tempo de um servidor. O serviço também monitora a conectividade de rede e aciona uma atualização de tempo quando nenhum sinal de tempo recente está disponível após longos períodos de conectividade ruim.

O serviço network_time_update_service tenta receber um sinal de tempo após a inicialização e quando a conectividade de rede é estabelecida pela primeira vez. Em seguida, o serviço tenta manter o indicador mais recente atualizado. Ele equilibra as necessidades de dispositivos Android individuais com a carga substancial que pode ser gerada por muitos dispositivos Android em todo o mundo ao atualizar o tempo.

Usando APIs internas, o network_time_update_service envia sugestões de horário de rede para o serviço time_detector. Outros componentes da plataforma Android usam essas sugestões de tempo de rede.

Depois de receber sugestões da origem de tempo da rede, o serviço time_detector determina se vai atualizar o relógio do sistema de acordo com as regras de priorização configuradas.

Para configurar o sistema de detecção automática de horário para usar as sugestões de origem de rede e definir o relógio do sistema automaticamente, use o arquivo de configuração do servidor do sistema core/res/res/values/config.xml. Verifique se o valor network está contido em config_autoTimeSourcesPriority na posição desejada. Para mais detalhes, consulte Prioridade da fonte de tempo.

Configuração do dispositivo

Esta seção descreve como os fabricantes de dispositivos podem configurar o sistema de detecção de tempo de rede.

A configuração básica do AOSP está em frameworks/base/core/res/res/values/config.xml:

Chave de configuração Valor do AOSP Descrição
config_ntpRetry 3 Após uma falha na atualização, esse é o número de vezes que o sistema tenta fazer a sondagem de tempo de rede com um intervalo de sondagem de NTP menor (config_ntpPollingIntervalShorter), antes de recuar e usar o intervalo de sondagem normal (config_ntpPollingInterval). Um valor menor que 0 significa que o sistema tenta pesquisar no intervalo de pesquisa NTP mais curto até conseguir atualizar.
config_ntpPollingInterval 64800000 (18 horas) O intervalo normal de pesquisa de tempo de rede em milissegundos.
config_ntpPollingIntervalShorter 60000 (1 minuto) O intervalo de sondagem de tempo da rede da nova tentativa em milissegundos. Usado quando uma atualização de tempo falha.
config_ntpServers Uma única entrada: ntp://time.android.com Servidores NTP a serem usados para obter um horário preciso. Os itens precisam estar no formato: ntp://<host>[:port].
Este não é um esquema de URI IANA registrado.
config_ntpTimeout 5000 Tempo de espera por uma resposta do servidor NTP em milissegundos antes do tempo limite.

Servidores

Por padrão, o AOSP usa servidores de tempo em time.android.com, que é um alias para NTP público do Google. Este serviço não tem SLA. Para ver mais detalhes, consulte as Perguntas frequentes sobre o NTP público do Google.

Suporte a vários servidores

Para o Android 14 e versões mais recentes, o framework oferece suporte a vários servidores NTP. Isso oferece suporte a situações em que os dispositivos são distribuídos globalmente com uma única configuração, mas o acesso a servidores como time.android.com é restrito em determinados lugares.

O algoritmo tenta cada servidor especificado na chave de configuração config_ntpServers. Quando encontra um que responde, o sistema continua usando esse servidor até que ele não seja atualizado ou o dispositivo seja reiniciado.

Precisão

A sincronização de hora da rede padrão do Android usa o SNTP com uma única consulta de tempo aproximadamente uma vez por dia para tentar garantir que sempre tenha um sinal de tempo recente.

Os efeitos de latência de rede são os maiores contribuintes para a imprecisão de tempo com a implementação do SNTP do Android. O SNTP assume atrasos de rede simétricos, ou seja, a latência de rede para a solicitação é a mesma da latência de rede para a resposta, e o tempo correto fica exatamente no meio dessa viagem de ida e volta da rede. Muitas vezes, o tempo de ida e volta da rede é da ordem de algumas centenas de milissegundos, e em uma rede com fio, a latência é quase simétrica, o que leva a níveis de imprecisão quase imperceptíveis para os usuários. No entanto, com a telefonia móvel ou por rádio, há vários estágios em que atrasos assimétricos relativamente longos podem ser inseridos em uma transação de rede, o que leva a uma maior imprecisão.

Com a configuração padrão do AOSP para config_ntpTimeout definida como 5000 milissegundos, e se toda a latência da rede estiver concentrada apenas no trecho de entrada ou saída, o erro teórico máximo será de aproximadamente 2,5 segundos.

A precisão geral do relógio do sistema também é afetada pela capacidade do dispositivo Android de rastrear o tempo decorrido com precisão após a obtenção de um sinal de tempo. Isso é uma preocupação com todos os cronômetros no Android, não apenas com a detecção de horário de rede, e é por isso que o serviço time_detector desconsidera sugestões de horário antigas. O serviço network_time_update_service é atualizado regularmente usando o intervalo config_ntpPollingInterval para manter o serviço time_detector fornecido com sugestões de tempo atualizadas e para garantir que o serviço time_detector não volte para origens de tempo de menor prioridade e, muitas vezes, de menor precisão ou ocasionalmente incorretas, como telephony.

Quando a detecção de tempo automático é usada, a precisão do relógio do sistema do dispositivo pode ser afetada por outras configurações do serviço time_detector, como as constantes e flags que afetam a diferença entre uma sugestão de tempo e o horário atual do relógio do sistema antes que ele seja ajustado (ServiceConfigAccessorImpl.java).

Os fabricantes de dispositivos podem modificar a precisão usando as opções e constantes de configuração anteriores. No entanto, é importante estar ciente das limitações da implementação do SNTP da plataforma e do possível impacto no consumo de energia de operações de rede mais frequentes, o impacto nos apps executados no dispositivo de ajustes de relógio mais frequentes, mas menores, e o efeito na carga do servidor.

Outros usos do tempo de rede

Se a detecção de tempo automático usando a origem network não estiver configurada ou se o usuário tiver desativado a detecção de tempo automático, o tempo recebido pelo serviço network_time_update_service ainda será usado pelos seguintes componentes:

  • O método SystemClock.currentNetworkTimeClock().
  • Funções internas da plataforma. Por exemplo, o A-GPS pode localizar um GNSS (local) primeiro a corrigir mais rapidamente quando tem informações de horário de rede.

Depuração e testes

A seção a seguir descreve os comandos do shell para depurar e testar o recurso de detecção de tempo de rede.

Interagir com o serviço network_time_update_service

Para despejar o estado atual de network_time_update_service, use:

adb shell cmd network_time_update_service dump

Para conferir um conjunto de opções de linha de comando que podem ajudar nos testes, use:

adb shell cmd network_time_update_service help