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