Rilevamento dell'ora di rete

I dispositivi Android tentano automaticamente di ottenere l'ora Unix corretta da una sorgente 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 dell'ora di rete. Un segnale orario da un server di sincronizzazione dell'ora 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 dell'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 un segnale orario recente dopo periodi prolungati di scarsa connettività.

Il servizio network_time_update_service tenta di ottenere un segnale orario dopo l'avvio e quando viene stabilita la connettività di rete. Il servizio tenta quindi di mantenere aggiornato l'ultimo segnale in suo possesso. Bilancia le esigenze dei singoli dispositivi Android con il carico sostanziale 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 sull'orario di rete al servizio time_detector. Altri componenti della piattaforma Android quindi utilizza questi suggerimenti sull'ora di 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 assegnazione delle priorità configurate.

Per configurare il sistema di rilevamento automatico dell'ora in modo che utilizzi i suggerimenti sull'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, vedi Priorità dell'origine ora.

Configurazione dispositivo

Questa sezione descrive come i produttori di dispositivi possono configurare il sistema di rilevamento dell'ora 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 tentativi di polling dell'ora di rete con un intervallo di polling NTP più breve (config_ntpPollingIntervalShorter), prima di eseguire il backoff e utilizzare l'intervallo di polling normale (config_ntpPollingInterval). Un valore inferiore a 0 indica che il sistema riprova il polling all'intervallo di polling NTP più breve finché non riesce ad aggiornarsi correttamente.
config_ntpPollingInterval 64800000 (18 ore) Il normale intervallo di polling dell'ora di rete in millisecondi.
config_ntpPollingIntervalShorter 60000 (1 minuto) L'intervallo di polling dell'ora di rete per i tentativi 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 orario preciso. Gli elementi devono essere nel formato: ntp://<host>[:port].
Questo non è uno schema URI IANA registrato.
config_ntpTimeout 5000 Tempo di attesa di una risposta da parte di un server NTP in millisecondi prima del timeout.

Server

Per impostazione predefinita, AOSP utilizza i server di sincronizzazione dell'ora all'indirizzo time.android.com, che è un alias di Google Public NTP. Questo servizio non ha 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. Ciò supporta le situazioni in cui i dispositivi vengono distribuiti a livello globale con una singola configurazione, ma in cui l'accesso a server come time.android.com è limitato in determinati luoghi.

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

 Precisione

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

Gli effetti della latenza di rete sono il principale fattore di imprecisione dell'ora con l'implementazione SNTP di Android. SNTP presuppone ritardi di rete simmetrici, ovvero la latenza di rete per la richiesta è uguale a quella per la risposta e l'ora corretta si trova esattamente a metà del round trip di rete. Spesso, il tempo di andata e ritorno della rete è dell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, il che porta a livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radiofonica ci sono diverse fasi in cui possono essere inseriti ritardi asimmetrici relativamente lunghi in una transazione di rete, il che comporta una maggiore imprecisione.

Con l'impostazione predefinita AOSP per config_ntpTimeout impostata su 5000 millisecondi e se tutta la latenza di rete è concentrata esclusivamente sulla tratta in entrata o in uscita, 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 l'ottenimento di un segnale orario. Questo problema riguarda tutta la gestione del tempo su Android, non solo il rilevamento dell'ora di rete, ed è per questo motivo che il servizio time_detector ignora i suggerimenti relativi all'ora precedente. Il servizio network_time_update_service viene aggiornato 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 origini temporali a priorità inferiore e spesso a precisione inferiore o occasionalmente errate, come telephony.

Quando viene utilizzato il rilevamento automatico dell'ora, la precisione 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 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 dovuto a operazioni di rete più frequenti, sull'impatto sulle app in esecuzione sul dispositivo dovuto a regolazioni dell'orologio più frequenti ma più piccole 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ò localizzare più rapidamente la prima correzione di un GNSS (posizione) quando dispone di informazioni sull'ora di rete.

Debug e test

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

Interagire con il servizio network_time_update_service

Per scaricare lo 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 aiutarti con i test, utilizza:

adb shell cmd network_time_update_service help