Rilevamento dell'ora di rete

I dispositivi Android tentano automaticamente di ottenere l'ora Unix epoch corretta da un'origine di rete. Android utilizza il protocollo SNTP (Simple Network Time Protocol), che a sua volta utilizza il protocollo UDP (User Datagram Protocol), per ottenere le 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 proveniente da un server 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 del 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.

Il servizio network_time_update_service invia suggerimenti sull'ora di rete al servizio time_detector utilizzando le API interne. Altri componenti della piattaforma Android utilizzano quindi questi suggerimenti sull'ora di rete.

Dopo aver ricevuto i suggerimenti dall'origine dell'ora di rete, il time_detector servizio 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 dell'origine di 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 ulteriori informazioni, vedi Priorità dell'origine dell'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 nel file config.xml: frameworks/base/core/res/res/values/config.xml:

Chiave di configurazione Valore AOSP Descrizione
config_ntpRetry 3 Dopo aver tentato di aggiornare l'ora, questo è il numero di volte in cui il sistema tenta di eseguire il 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 a eseguire il polling con l'intervallo di polling NTP più breve finché non riesce ad aggiornare l'ora.
config_ntpPollingInterval 64800000 (18 ore) L'intervallo di polling dell'ora di rete normale in millisecondi.
config_ntpPollingIntervalShorter 60000 (1 minuto) L'intervallo di polling dell'ora di rete di ripetizione in millisecondi. Utilizzato quando un aggiornamento dell'ora non riesce.
config_ntpServers Una singola voce: ntp://time.android.com I server NTP da utilizzare per ottenere un'ora precisa. Gli elementi devono essere nel formato: ntp://<host>[:port].
Questo non è uno schema URI IANA registrato.
config_ntpTimeout 5000 Il tempo di attesa di una risposta del server NTP in millisecondi prima del timeout.

Server

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

L'algoritmo tenta di accedere a ogni server specificato nella chiave di configurazione config_ntpServers. Quando l'algoritmo ne trova uno che risponde, il sistema continua a utilizzare quel server finché non riesce ad aggiornare l'ora o il dispositivo non viene riavviato.

Accuratezza

La sincronizzazione dell'ora di rete predefinita di Android utilizza SNTP con una singola query dell'ora circa una volta al giorno, in modo da avere sempre un segnale orario recente.

Gli effetti della latenza di rete contribuiscono in modo significativo all'imprecisione dell'ora 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 a metà del round trip di 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 porta a livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radio ci sono diverse fasi in cui è possibile inserire ritardi asimmetrici relativamente lunghi in una transazione di rete, il che porta a una maggiore imprecisione.

Con l'impostazione predefinita di 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.

L'accuratezza complessiva dell'orologio di sistema è influenzata anche dalla capacità del dispositivo Android di tenere traccia con precisione del tempo trascorso dopo aver ottenuto un segnale orario. Questo è un problema con tutti i sistemi di cronometraggio su Android, non solo con il rilevamento dell'ora di rete, motivo per cui il servizio time_detector ignora i suggerimenti sull'ora obsoleti. Il servizio network_time_update_service si aggiorna regolarmente utilizzando l'intervallo config_ntpPollingInterval per fornire al servizio time_detector suggerimenti sull'ora aggiornati e per garantire che il servizio time_detector non torni a origini dell'ora a priorità inferiore e spesso a precisione inferiore o occasionalmente 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 come le costanti e i flag che determinano la differenza tra un suggerimento sull'ora 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 di configurazione e le costanti 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, dell'impatto sulle app in esecuzione sul dispositivo dovuto a regolazioni dell'orologio più frequenti ma più piccole e dell'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 network_time_update_service servizio viene comunque utilizzata dai seguenti componenti:

  • Il metodo SystemClock.currentNetworkTimeClock().
  • Funzioni della piattaforma interna. Ad esempio, A-GPS può individuare più rapidamente una prima correzione 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 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 aiutarti a eseguire i test, utilizza:

adb shell cmd network_time_update_service help