Android-Geräte versuchen automatisch, die richtige Unix-Epochenzeit von einer Netzwerkquelle abzurufen. Android verwendet das SNTP-Protokoll, das das UDP-Protokoll verwendet, um Zeitinformationen abzurufen.
Die auf dieser Seite beschriebenen Komponenten sind Teil des Systems zur automatischen Zeiterkennung, das als Netzwerkzeitursprung bezeichnet wird. Die Systemuhr eines Android-Geräts kann anhand eines Zeitsignals von einem Netzwerkzeitserver eingestellt werden, wenn die automatische Zeiterkennung auf dem Gerät unterstützt wird und der time_detector
-Dienst für die Verwendung konfiguriert ist.
Standardmäßig verwendet Android die Netzwerkzeit als primären Ursprung für die automatische Zeiterkennung.
Network Time Detection System
Der network_time_update_service
-Dienst, der auf dem Android-Systemserver ausgeführt wird, implementiert das Netzwerkzeiterkennungssystem. Der Dienst verwendet regelmäßig SNTP, um ein Zeitsignal von einem Server abzurufen. Der Dienst überwacht auch die Netzwerkverbindung und löst eine Zeitaktualisierung aus, wenn nach längeren Zeiträumen mit schlechter Verbindung kein aktuelles Zeitsignal verfügbar ist.
Der network_time_update_service
-Dienst versucht, nach dem Start und bei der ersten Herstellung einer Netzwerkverbindung ein Zeitsignal zu erhalten. Der Dienst versucht dann, das aktuelle Signal auf dem neuesten Stand zu halten. Dabei werden die Anforderungen einzelner Android-Geräte mit der erheblichen Last in Einklang gebracht, die durch die Zeitsynchronisierung vieler Android-Geräte weltweit entstehen könnte.
Über interne APIs sendet network_time_update_service
Vorschläge zur Netzwerkzeit an den time_detector
-Dienst. Andere Komponenten der Android-Plattform verwenden dann diese Netzwerkzeitvorschläge.
Nachdem der time_detector
-Dienst Vorschläge vom Netzwerkzeitursprung erhalten hat, bestimmt er, ob die Systemuhr gemäß den konfigurierten Priorisierungsregeln aktualisiert werden soll.
Wenn Sie das System zur automatischen Zeiterkennung so konfigurieren möchten, dass die Systemuhr automatisch anhand der Vorschläge für den Netzwerkursprung eingestellt wird, verwenden Sie die Konfigurationsdatei core/res/res/values/config.xml
für den Systemserver. Der Wert network
muss an der gewünschten Position in config_autoTimeSourcesPriority
enthalten sein. Weitere Informationen finden Sie unter Priorität der Zeitquelle.
Gerätekonfiguration
In diesem Abschnitt wird beschrieben, wie Gerätehersteller das System zur Netzwerkzeiterkennung konfigurieren können.
Die Basis-AOSP-Konfiguration befindet sich unter frameworks/base/core/res/res/values/config.xml
:
Konfigurationsschlüssel | AOSP-Wert | Beschreibung |
---|---|---|
config_ntpRetry |
3 |
Dies ist die Anzahl der Wiederholungen, mit denen das System nach einem fehlgeschlagenen Aktualisierungsversuch die Netzwerkzeit mit einem kürzeren NTP-Abfrageintervall (config_ntpPollingIntervalShorter ) abfragt, bevor es zum normalen Abfrageintervall (config_ntpPollingInterval ) zurückkehrt. Bei einem Wert unter 0 wiederholt das System die Abfrage mit dem kürzeren NTP-Abfrageintervall, bis die Aktualisierung erfolgreich abgeschlossen werden kann. |
config_ntpPollingInterval |
64800000 (18 Stunden) |
Das normale Polling-Intervall für die Netzwerkzeit in Millisekunden. |
config_ntpPollingIntervalShorter |
60000 (1 Minute) |
Intervall für die Wiederholung der Netzwerkzeitabfrage in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt. |
config_ntpServers |
Ein einzelner Eintrag: ntp://time.android.com |
NTP-Server, die zur Ermittlung der genauen Uhrzeit verwendet werden sollen. Elemente müssen das Format ntp://<host>[:port] haben.
Das ist kein registriertes IANA-URI-Schema. |
config_ntpTimeout |
5.000 | Zeit in Millisekunden, die auf eine NTP-Serverantwort gewartet wird, bevor die Zeitüberschreitung eintritt. |
Server
Standardmäßig verwendet AOSP Zeitserver unter time.android.com
, einem Alias für Google Public NTP. Für diesen Dienst gilt kein SLA. Weitere Informationen finden Sie in den häufig gestellten Fragen zu Google Public NTP.
Unterstützung mehrerer Server
Ab Android 14 unterstützt das Framework mehrere NTP-Server. Dies ist hilfreich, wenn Geräte weltweit mit einer einzigen Konfiguration bereitgestellt werden, der Zugriff auf Server wie time.android.com
aber an bestimmten Orten eingeschränkt ist.
Der Algorithmus versucht, jeden im Konfigurationsschlüssel config_ntpServers
angegebenen Server zu verwenden. Wenn ein Server gefunden wird, der antwortet, verwendet das System diesen Server so lange, bis die Aktualisierung fehlschlägt oder das Gerät neu gestartet wird.
Genauigkeit
Die standardmäßige Netzwerkzeitsynchronisierung von Android verwendet SNTP mit einer einzelnen Zeitabfrage, die etwa einmal täglich erfolgt, um dafür zu sorgen, dass immer ein aktuelles Zeitsignal verfügbar ist.
Netzwerklatenzeffekte tragen am stärksten zu Zeitabweichungen bei der SNTP-Implementierung von Android bei. SNTP geht von symmetrischen Netzwerkverzögerungen aus, d. h., die Netzwerklatenz für die Anfrage ist gleich der Netzwerklatenz für die Antwort und die richtige Zeit liegt genau in der Mitte dieses Netzwerk-Roundtrips. Die Netzwerk-Umlaufzeit liegt oft im Bereich von einigen hundert Millisekunden und in einem drahtgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Nutzer kaum wahrnehmbar sind. Bei der Mobilfunk- oder Funktelefonie gibt es jedoch mehrere Phasen, in denen relativ lange, asymmetrische Verzögerungen in eine Netzwerktransaktion eingefügt werden können, was zu größeren Abweichungen führt.
Wenn die AOSP-Standardeinstellung für config_ntpTimeout
auf 5000
Millisekunden festgelegt ist und sich die gesamte Netzwerklatenz nur auf den ein- oder ausgehenden Pfad konzentriert, beträgt der maximale theoretische Fehler etwa 2, 5 Sekunden.
Die Gesamtgenauigkeit der Systemuhr hängt auch davon ab, ob das Android-Gerät die verstrichene Zeit nach Erhalt eines Zeitsignals genau erfassen kann. Das ist nicht nur bei der Netzwerkzeiterkennung, sondern bei der gesamten Zeitmessung auf Android-Geräten ein Problem. Deshalb werden alte Zeitvorschläge vom time_detector
-Dienst ignoriert. Der network_time_update_service
-Dienst wird regelmäßig mit dem config_ntpPollingInterval
-Intervall aktualisiert, damit der time_detector
-Dienst immer aktuelle Zeitvorschläge erhält und nicht auf weniger priorisierte und oft weniger genaue oder gelegentlich falsche Zeitquellen wie telephony
zurückgreift.time_detector
Wenn die automatische Zeiterkennung verwendet wird, kann sich die Genauigkeit der Systemuhr des Geräts durch andere Konfigurationen des time_detector
-Dienstes beeinflussen lassen, z. B. durch Konstanten und Flags, die festlegen, wie stark sich ein Zeitvorschlag von der aktuellen Systemuhrzeit unterscheiden muss, bevor die Uhr angepasst wird (ServiceConfigAccessorImpl.java
).
Gerätehersteller können die Genauigkeit mithilfe der oben genannten Konfigurationsoptionen und Konstanten ändern. Es ist jedoch wichtig, sich der Einschränkungen der SNTP-Implementierung der Plattform und der potenziellen Auswirkungen auf den Energieverbrauch durch häufigere Netzwerkvorgänge, der Auswirkungen auf auf dem Gerät ausgeführte Apps durch häufigere, aber kleinere Zeitkorrekturen und der Auswirkungen auf die Serverlast bewusst zu sein.
Andere Verwendungen der Netzwerkzeit
Wenn die automatische Zeiterkennung mit dem network
-Ursprung nicht konfiguriert ist oder der Nutzer die automatische Zeiterkennung deaktiviert hat, wird die vom network_time_update_service
-Dienst abgerufene Zeit weiterhin von den folgenden Komponenten verwendet:
- Die Methode
SystemClock.currentNetworkTimeClock()
. - Interne Plattformfunktionen So kann A-GPS beispielsweise eine GNSS-Fixierung (Standort) schneller vornehmen, wenn es Informationen zur Netzwerkzeit hat.
Debugging und Tests
Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Funktion zur Netzwerkzeiterkennung beschrieben.
Mit dem Dienst „network_time_update_service“ interagieren
So rufen Sie den aktuellen Status von network_time_update_service
ab:
adb shell cmd network_time_update_service dump
Wenn Sie eine Reihe von Befehlszeilenoptionen sehen möchten, die Ihnen beim Testen helfen können, verwenden Sie Folgendes:
adb shell cmd network_time_update_service help