Erkennung der Netzwerkzeit

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 den Ursprung des Netzwerks als primären Ursprung für die automatische Zeiterkennung.

Network Time Detection System

Der Dienst network_time_update_service, 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 wenn die Netzwerkverbindung zum ersten Mal hergestellt wird, ein Zeitsignal zu erhalten. Der Dienst versucht dann, das neueste 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 kann.

Ü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 des core/res/res/values/config.xml-Systemservers. 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 AOSP-Basiskonfiguration 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.
Dies 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 unter Google Public NTP – FAQs.

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 Server, der im Konfigurationsschlüssel config_ntpServers angegeben ist. 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

Bei der standardmäßigen Netzwerkzeitsynchronisierung von Android wird SNTP mit einer einmaligen Abfrage pro Tag verwendet, um sicherzustellen, dass immer ein aktuelles Zeitsignal vorliegt.

Netzwerklatenzeffekte tragen hauptsächlich zur Zeitungenauigkeit 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. Häufig liegt die Netzwerkumlaufzeit in der Größenordnung von wenigen Hundert Millisekunden und in einem kabelgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Nutzer praktisch nicht 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 gesetzt ist und die gesamte Netzwerklatenz ausschließlich auf den eingehenden oder ausgehenden Abschnitt konzentriert ist, 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, 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 sich darauf auswirken, 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 vorherigen 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 Zum Beispiel kann A-GPS eine GNSS-Standortbestimmung schneller finden, wenn sie über Netzwerkzeitinformationen verfügt.

Debugging und Tests

Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Funktion zur Erkennung der Netzwerkzeit 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