Detecção de horário da rede

Os dispositivos Android tentam automaticamente obter a hora de época Unix correta de uma fonte de rede. O Android usa o protocolo SNTP, que usa o protocolo UDP, para receber informações de tempo.

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 horário da rede como a principal origem da 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 da rede e aciona uma atualização de tempo quando nenhum sinal de tempo recente está disponível após períodos prolongados 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. O serviço tenta manter o sinal 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 horário da rede, o serviço time_detector determina se precisa atualizar o relógio do sistema de acordo com as regras de priorização configuradas.

Para configurar o sistema de detecção de tempo automático para usar as sugestões de origem de rede para 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 da 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 Depois de falhar na atualização, esse é o número de vezes que o sistema tenta fazer a pesquisa de tempo de rede com um intervalo de pesquisa NTP mais curto (config_ntpPollingIntervalShorter), antes de voltar e usar o intervalo de pesquisa normal (config_ntpPollingInterval). Um valor menor que 0 significa que o sistema tenta novamente a pesquisa no intervalo de pesquisa NTP mais curto até que seja possível 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 pesquisa de tempo de rede de 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 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 da latência de rede são o maior contribuinte 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 retorno da rede é de algumas centenas de milissegundos e, em uma rede com fio, a latência é próxima a simétrica, levando 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 automática de hora é 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 horário e o horário atual do sistema antes do ajuste (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 uma correção de GNSS (localização) mais rapidamente quando tem informações de tempo de rede.

Depuração e testes

Na seção a seguir, descrevemos os comandos do shell para depurar e testar o recurso de detecção de tempo da 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