Detecção de tempo de rede

Os dispositivos Android tentam automaticamente receber a hora correta da época Unix de uma fonte de rede. O Android usa o Simple Network Time Protocol (SNTP), que usa o protocolo de datagramas do usuário (UDP), para receber informações de hora.

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

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

Sistema de detecção de hora da rede

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

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

O serviço network_time_update_service envia sugestões de hora da rede para o serviço time_detector usando APIs internas. Outros componentes da plataforma Android usam essas sugestões de hora da rede.

Depois de receber sugestões da origem da hora da rede, o time_detector serviço determina se deve 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 hora para usar as sugestões de origem da 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 informações, consulte Prioridade da fonte de hora.

Configuração do dispositivo

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

A configuração base do AOSP está no arquivo config.xml: 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 a pesquisa de hora da rede com um intervalo de pesquisa NTP mais curto (config_ntpPollingIntervalShorter), antes de fazer o back-off e usar o intervalo de pesquisa normal (config_ntpPollingInterval). Um valor menor que 0 significa que o sistema tenta 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 hora da rede em milissegundos.
config_ntpPollingIntervalShorter 60000 (1 minuto) O intervalo de pesquisa de hora da rede de nova tentativa em milissegundos. Usado quando uma atualização de hora falha.
config_ntpServers Uma única entrada: ntp://time.android.com Servidores NTP a serem usados para receber uma hora precisa. Os itens precisam estar no formato: ntp://<host>[:port].
Esse não é um esquema de URI da IANA registrado.
config_ntpTimeout 5000 Tempo de espera pela resposta de um servidor NTP em milissegundos antes do tempo limite.

Servidores

Por padrão, o AOSP usa servidores de hora em time.android.com, que é um alias do NTP público do Google. Esse serviço não tem SLA. Para mais informações, consulte as Perguntas frequentes sobre o NTP público do Google.

Suporte a vários servidores

No 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 em que o acesso a servidores como time.android.com é restrito em determinados locais.

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

Precisão

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

Os efeitos de latência da rede são um fator significativo para a imprecisão de hora com a implementação do SNTP do Android. O SNTP pressupõe atrasos de rede simétricos, ou seja, a latência de rede da solicitação é a mesma da latência de rede da resposta, e a hora correta está exatamente no meio dessa viagem de ida e volta da rede. Muitas vezes, o tempo de viagem 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, levando a níveis de imprecisão quase imperceptíveis para os usuários. No entanto, com telefonia móvel ou rádio, há várias etapas em que atrasos assimétricos relativamente longos podem ser inseridos em uma transação de rede, levando 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 de rede estiver concentrada apenas na perna 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 hora. Essa é uma preocupação com toda a cronometragem no Android, não apenas com a detecção de hora da rede. É por isso que o serviço time_detector ignora sugestões de hora 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 hora recentes e garantir que o serviço time_detector não volte a origens de hora de prioridade mais baixa 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 determinam o quanto uma sugestão de hora precisa ser diferente da hora atual do relógio do sistema antes que o relógio 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, no impacto nos apps em execução no dispositivo de ajustes de relógio mais frequentes, mas menores, e no efeito na carga do servidor.

Outros usos da hora da rede

Se a detecção automática de hora usando a origem network não estiver configurada ou se o usuário tiver desativado a detecção automática de hora, a hora recebida pelo network_time_update_service serviço ainda será usada pelos seguintes componentes:

  • O método SystemClock.currentNetworkTimeClock().
  • Funções internas da plataforma. Por exemplo, o A-GPS pode localizar uma correção GNSS (localização) mais rapidamente quando tem informações de hora da rede.

Depuração e testes

A seção a seguir descreve comandos de shell para depurar e testar o recurso de detecção de hora 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