Os dispositivos Android tentam automaticamente obter a hora da época Unix correta de uma fonte de rede. O Android usa o protocolo SNTP, que usa o protocolo 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 de hora da rede. Um sinal de horário 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 automática de horário é 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 principal origem de detecção automática de tempo.
Sistema de detecção de horário de rede
O serviço network_time_update_service
, que é executado no servidor do sistema Android,
implementa o sistema de detecção de horário de rede. O serviço usa o 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 horário quando nenhum sinal de horário recente está disponível após longos períodos de conectividade ruim.
O serviço network_time_update_service
tenta receber um sinal de horário após a
inicialização e quando a conectividade de rede é estabelecida pela primeira vez. Em seguida, o serviço tenta manter atualizado o último indicador que ele tem. Ele equilibra as necessidades de dispositivos Android individuais com a carga substancial que pode ser gerada por muitos dispositivos Android no mundo todo atualizando a hora.
Usando APIs internas, o network_time_update_service
envia sugestões de horário de rede ao serviço time_detector
. Outros componentes da plataforma Android
e use essas sugestões de horário de rede.
Depois de receber sugestões da origem de tempo da rede, o serviço time_detector
determina se deve atualizar o relógio do sistema de acordo com as
regras de priorização configuradas.
Para configurar o sistema automático de detecção de hora para usar as sugestões de origem da 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
Nesta seção, descrevemos como os fabricantes de dispositivos podem configurar o sistema de detecção de horário de rede.
A configuração base 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 não conseguir atualizar, esse é o número de vezes que o sistema tenta
a pesquisa de tempo de rede com um intervalo de pesquisa NTP mais curto
(config_ntpPollingIntervalShorter ), antes de fazer o backoff 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é conseguir atualizar. |
config_ntpPollingInterval |
64800000 (18 horas) |
O intervalo normal de sondagem de tempo de rede em milissegundos. |
config_ntpPollingIntervalShorter |
60000 (1 minuto) |
O intervalo de sondagem 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 uma hora precisa. Os itens precisam estar no formato:
ntp://<host>[:port] .
Este não é um esquema de URI registrado na IANA. |
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 o 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
No Android 14 e versões mais recentes, o framework oferece suporte a
vários servidores NTP. Isso é útil em 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 ele encontra um que responde, o sistema continua usando
esse servidor até que ele não consiga atualizar ou o dispositivo seja reinicializado.
Precisão
A sincronização de horário de rede padrão do Android usa o SNTP com uma única consulta de horário aproximadamente uma vez por dia para tentar garantir que ele sempre tenha um sinal de horário recente.
Os efeitos da 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 pressupõe atrasos simétricos na rede, ou seja, a latência da rede para a solicitação é a mesma que a latência da rede para a resposta, e a hora correta 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 cabeada, 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, levando a 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 depois que um sinal de tempo é obtido. Isso é um problema com toda a marcação de tempo no Android, não apenas com a detecção de horário de rede. Por isso, o serviço time_detector
ignora 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 horário atualizadas e garantir que o serviço time_detector
não volte a origens de horário 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 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 acurácia usando as opções e constantes de configuração anteriores. No entanto, é importante estar ciente das limitações da implementação do SNTP na plataforma e do possível impacto no consumo de energia devido a operações de rede mais frequentes, no impacto nos apps em execução no dispositivo devido a 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 essa detecção, a hora obtida pelo serviço network_time_update_service
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 inicial de GNSS (localização) mais rápido quando tem informações de tempo da 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 horário 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