Rilevamento dell'ora di rete

I dispositivi Android tentano automaticamente di ottenere il tempo di epoch di Unix corretto da una fonte di rete. Android utilizza il protocollo SNTP, che utilizza il protocollo UDP, per ottenere informazioni sull'ora.

I componenti descritti in questa pagina fanno parte del sistema di rilevamento automatico dell'ora, chiamato origine ora di rete. Un segnale orario di un server orario di rete può essere utilizzato per impostare l'orologio di sistema del dispositivo Android quando il rilevamento automatico dell'ora è supportato sul dispositivo e il servizio time_detector è configurato per utilizzarlo.

Per impostazione predefinita, Android utilizza l'origine ora di rete come origine principale per il rilevamento automatico dell'ora.

Sistema di rilevamento dell'ora di rete

Il servizio network_time_update_service in esecuzione nel server di sistema Android implementa il sistema di rilevamento dell'ora di rete. Il servizio utilizza periodicamente SNTP per ottenere un segnale orario da un server. Il servizio monitora anche la connettività di rete e attiva un aggiornamento dell'ora quando non è disponibile alcun segnale orario recente dopo periodi prolungati di scarsa connettività.

Il servizio network_time_update_service tenta di ottenere un segnale di tempo dopo l'avvio e quando viene stabilita per la prima volta la connettività di rete. Il servizio quindi cerca di mantenere aggiornato l'ultimo indicatore in suo possesso. Equilibra le esigenze dei singoli dispositivi Android con il carico considerevole che potrebbe essere generato da molti dispositivi Android in tutto il mondo che aggiornano l'ora.

Utilizzando le API interne, network_time_update_service invia suggerimenti per l'ora della rete al servizio time_detector. Altri componenti della piattaforma Android utilizzano poi questi suggerimenti relativi all'ora della rete.

Dopo aver ricevuto i suggerimenti dall'origine dell'ora di rete, il servizio time_detector determina se aggiornare l'orologio di sistema in base alle regole di definizione delle priorità configurate.

Per configurare il sistema di rilevamento automatico dell'ora in modo che utilizzi i suggerimenti per l'origine della rete per impostare automaticamente l'orologio di sistema, utilizza il file di configurazione del server di sistema core/res/res/values/config.xml. Assicurati che il valore network sia contenuto in config_autoTimeSourcesPriority nella posizione desiderata. Per maggiori dettagli, consulta Priorità dell'origine ora.

Configurazione dispositivo

Questa sezione descrive come i produttori di dispositivi possono configurare il sistema di rilevamento del tempo di rete.

La configurazione AOSP di base si trova in frameworks/base/core/res/res/values/config.xml:

Chiave di configurazione Valore AOSP Descrizione
config_ntpRetry 3 Dopo un mancato aggiornamento, indica il numero di volte in cui il sistema tenta il polling del tempo di rete con un intervallo di polling NTP più breve (config_ntpPollingIntervalShorter) prima di eseguire il backup e utilizzare l'intervallo di polling normale (config_ntpPollingInterval). Un valore inferiore a 0 indica che il sistema riprova a eseguire il polling con l'intervallo di polling NTP più breve finché non riesce ad aggiornarsi correttamente.
config_ntpPollingInterval 64800000 (18 ore) L'intervallo di polling del tempo di rete normale in millisecondi.
config_ntpPollingIntervalShorter 60000 (1 minuto) L'intervallo di polling del tempo di rete per i tentativi successivi in millisecondi. Utilizzato quando un aggiornamento dell'ora non va a buon fine.
config_ntpServers Una singola voce: ntp://time.android.com Server NTP da utilizzare per ottenere un'ora precisa. Gli elementi devono essere nel formato: ntp://<host>[:port].
Non si tratta di uno schema URI IANA registrato.
config_ntpTimeout 5000 Tempo di attesa di una risposta del server NTP in millisecondi prima del timeout.

Server

Per impostazione predefinita, AOSP utilizza i server di tempo all'indirizzo time.android.com, che è un alias per Google Public NTP. Questo servizio non ha alcun SLA. Per maggiori dettagli, consulta le Domande frequenti su Google Public NTP.

Supporto di più server

Per Android 14 e versioni successive, il framework supporta più server NTP. Questo supporta le situazioni in cui i dispositivi sono distribuiti a livello globale con una singola configurazione, ma l'accesso ai server come time.android.com è limitato in alcuni luoghi.

L'algoritmo prova ogni server specificato nella config_ntpServers chiave di configurazione. Quando ne trova uno che risponde, il sistema continua a utilizzare quel server finché non riesce ad aggiornarsi o il dispositivo non si riavvia.

 Accuratezza

La sincronizzazione dell'ora di rete predefinita di Android utilizza SNTP con una singola query sull'ora circa una volta al giorno per cercare di garantire sempre un segnale orario recente.

Gli effetti della latenza della rete sono il fattore più importante che contribuisce all'inaccuratezza del tempo con l'implementazione SNTP di Android. SNTP presuppone ritardi di rete simmetrici, ovvero la latenza di rete per la richiesta è la stessa della latenza di rete per la risposta e l'ora corretta si trova esattamente al centro del percorso di andata e ritorno della rete. Spesso il tempo di round trip della rete è dell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, il che comporta livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radio esistono diverse fasi in cui possono essere inseriti ritardi asimmetrici relativamente lunghi in una transazione di rete che comportano una maggiore imprecisione.

Con l'impostazione predefinita AOSP per config_ntpTimeout impostata su 5000 millisecondi, e se tutta la latenza della rete è concentrata esclusivamente sul tratto inbound o outbound, l'errore teorico massimo è di circa 2,5 secondi.

La precisione complessiva dell'orologio di sistema è influenzata anche dalla capacità del dispositivo Android di monitorare con precisione il tempo trascorso dopo aver ottenuto un segnale orario. Questo è un problema con tutto il rilevamento dell'ora su Android, non solo con il rilevamento dell'ora di rete, ed è il motivo per cui il servizio time_detector ignora i vecchi suggerimenti sull'ora. Il servizio network_time_update_service si aggiorna regolarmente utilizzando l'intervallo config_ntpPollingInterval per fornire al servizio time_detector suggerimenti orari aggiornati e per assicurarsi che il servizio time_detector non torni a origini orarie di priorità inferiore e spesso meno precise o talvolta errate come telephony.

Quando viene utilizzato il rilevamento automatico dell'ora, l'accuratezza dell'orologio di sistema del dispositivo può essere influenzata da altre configurazioni del servizio time_detector, ad esempio le costanti e i flag che influiscono sulla differenza che deve esserci tra un suggerimento di orario e l'ora corrente dell'orologio di sistema prima che l'orologio venga regolato (ServiceConfigAccessorImpl.java).

I produttori di dispositivi possono modificare l'accuratezza utilizzando le opzioni e le costanti di configurazione precedenti. Tuttavia, è importante essere consapevoli delle limitazioni dell'implementazione SNTP della piattaforma e del potenziale impatto sul consumo energetico derivante da operazioni di rete più frequenti, sull'impatto delle app in esecuzione sul dispositivo derivante da aggiustamenti dell'orologio più frequenti, ma più piccoli, e sull'effetto sul carico del server.

Altri utilizzi dell'ora di rete

Se il rilevamento automatico dell'ora utilizzando l'origine network non è configurato o se l'utente ha disattivato il rilevamento automatico dell'ora, l'ora ottenuta dal servizio network_time_update_service viene comunque utilizzata dai seguenti componenti:

  • Il metodo SystemClock.currentNetworkTimeClock().
  • Funzioni della piattaforma interna. Ad esempio, l'A-GPS può individuare più rapidamente una correzione GNSS (posizione) se dispone di informazioni sull'ora della rete.

Debug e test

La sezione seguente descrive i comandi shell per il debug e il test della funzionalità di rilevamento dell'ora di rete.

Interagire con il servizio network_time_update_service

Per eseguire il dump dello stato attuale di network_time_update_service, utilizza:

adb shell cmd network_time_update_service dump

Per visualizzare un insieme di opzioni della riga di comando che possono essere utili per i test, utilizza:

adb shell cmd network_time_update_service help