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