Detecção de tempo de rede

Os dispositivos Android tentam automaticamente obter o horário correto da época Unix de uma fonte de rede. O Android usa o protocolo SNTP, que usa o protocolo UDP, para obter informações de horário.

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 hora é suportada no dispositivo e o serviço time_detector está configurado para usá-lo.

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

Sistema de detecção de horário de rede

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

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

Usando APIs internas, 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 horário de rede.

Depois de receber sugestões da origem do horário 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 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 . Certifique-se de que a network de valores esteja contida em config_autoTimeSourcesPriority na posição desejada. Para obter 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 horário da rede.

A configuração básica do AOSP está em frameworks/base/core/res/res/values/config.xml :

Chave de configuração Valor AOSP Descrição
config_ntpRetry 3 Após falha na atualização, este é o número de vezes que o sistema tenta a sondagem de tempo de rede com um intervalo de sondagem NTP mais curto ( config_ntpPollingIntervalShorter ), antes de recuar e usar o intervalo de sondagem normal ( config_ntpPollingInterval ). Um valor menor que 0 significa que o sistema tenta novamente a sondagem no intervalo de sondagem NTP mais curto até que seja capaz de atualizar com êxito.
config_ntpPollingInterval 64800000 (18 horas) O intervalo normal de pesquisa de tempo da rede em milissegundos.
config_ntpPollingIntervalShorter 60000 (1 minuto) O intervalo de sondagem de tempo de rede de repetição em milissegundos. Usado quando uma atualização de horário falha.
config_ntpServers Uma única entrada: ntp://time.android.com Servidores NTP a serem usados ​​para obter uma hora precisa. Os itens devem estar no formato: ntp://<host>[:port] .
Este não é um esquema de URI registrado da IANA.
config_ntpTimeout 5.000 Tempo de espera por uma resposta do servidor NTP em milissegundos antes do tempo limite.

Servidores

Por padrão, o AOSP usa servidores de horário em time.android.com , que é um alias para Google Public NTP . Este serviço não possui SLA. Para obter detalhes, consulte as Perguntas frequentes sobre o NTP público do Google .

Suporte a vários servidores

Para Android 14 e superior, a estrutura 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 onde 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 encontra um que responde, o sistema continua usando esse servidor até que haja falha na atualização ou o dispositivo seja reinicializado.

Precisão

A sincronização de horário de rede padrão do Android usa SNTP com uma única consulta de horário aproximadamente uma vez por dia para tentar garantir que sempre haja um sinal de horário recente.

Os efeitos de latência da rede são os que mais contribuem para a imprecisão do 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 é igual à latência de rede para a resposta, e o tempo correto está 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, levando a níveis de imprecisão quase imperceptíveis para os usuários. Contudo, com a telefonia móvel ou por rádio existem várias fases em que atrasos relativamente longos e assimétricos podem ser inseridos numa transacção de rede, conduzindo 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 exclusivamente 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 com precisão o tempo decorrido após a obtenção de um sinal de tempo. Essa é uma preocupação com toda a cronometragem no Android, não apenas com a detecção de horário da rede, e é por isso que o serviço time_detector desconsidera as sugestões de horário antigo. 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 para garantir que o serviço time_detector não retorne para origens de horário 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 sinalizadores que afetam a diferença entre uma sugestão de hora e a 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. Mas é importante estar ciente das limitações da implementação do SNTP da plataforma e do impacto potencial no consumo de energia de operações de rede mais frequentes, do impacto nos aplicativos executados no dispositivo devido a ajustes de relógio mais frequentes, porém menores, e do efeito na carga do servidor.

Outros usos do tempo de rede

Se a detecção automática de hora usando a origem network não estiver configurada ou se o usuário tiver desabilitado a detecção automática de hora, 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 um primeiro ponto GNSS (localização) mais rapidamente quando possui informações de horário da rede.

Depuração e teste

A seção a seguir descreve comandos shell para depuração e teste do recurso de detecção de horário de rede.

Interaja 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 ver um conjunto de opções de linha de comando que podem ajudar nos testes, use:

adb shell cmd network_time_update_service help