Rilevamento del tempo 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 denominato origine ora della 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 sul server del sistema Android implementa il sistema di rilevamento dell'ora della 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 in che modo 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 il mancato aggiornamento, questo è il numero di volte in cui il sistema tenta di eseguire il polling con un intervallo di polling NTP più breve (config_ntpPollingIntervalShorter), prima di tornare indietro e utilizzare l'intervallo di polling normale (config_ntpPollingInterval). Un valore minore di 0 indica che il sistema riesegue il polling a un intervallo di polling NTP più breve fino a quando non riesce ad aggiornare 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 riesce.
config_ntpServers Una singola voce: ntp://time.android.com Server NTP da utilizzare per ottenere un'ora precisa. Gli elementi devono avere il formato: ntp://<host>[:port].
Questo non è 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 alcuno 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 una che risponde, il sistema continua a utilizzare il server finché non riesce a eseguire l'aggiornamento o fino al riavvio del dispositivo.

 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 che si verifichino ritardi di rete simmetrici, ovvero che la latenza di rete per la richiesta sia la stessa della latenza di rete per la risposta e che l'ora corretta sia esattamente nel mezzo del round trip della rete. Spesso il tempo di round trip della rete è nell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, con livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radio ci sono diverse fasi in cui è possibile inserire ritardi relativamente lunghi e asimmetrici in una transazione di rete con una conseguente maggiore inesattezza.

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 dipende anche dalla capacità del dispositivo Android di rilevare accuratamente il tempo trascorso dopo aver ottenuto il segnale di un orario. Questo è un problema con tutto il rilevamento dell'ora su Android, non solo con il rilevamento dell'ora di rete, ed è per questo che 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 mantenere il servizio time_detector fornito con suggerimenti di orario aggiornati e per garantire che il servizio time_detector non torni a priorità inferiore e spesso a precisione inferiore o a volte origini temporali 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 conoscere i limiti dell'implementazione SNTP della piattaforma e il potenziale impatto sul consumo energetico dovuto a operazioni di rete più frequenti, l'impatto sulle app in esecuzione sul dispositivo da regolazioni più frequenti ma minori dell'orologio e l'effetto sul carico del server.

Altri utilizzi del tempo 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 di piattaforma interne. 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, usa:

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