Netzwerkzeiterkennung

Android-Geräte versuchen automatisch, die korrekte Unix-Epochenzeit von einer Netzwerkquelle zu erhalten. Android verwendet das SNTP-Protokoll, das das UDP-Protokoll verwendet, um Zeitinformationen zu erhalten.

Die auf dieser Seite beschriebenen Komponenten sind Teil des automatischen Zeiterkennungssystems, das als Netzwerkzeitursprung bezeichnet wird. Ein Zeitsignal von einem Netzwerkzeitserver kann zum Einstellen der Systemuhr des Android-Geräts verwendet werden, wenn die automatische Zeiterkennung auf dem Gerät unterstützt wird und der Dienst time_detector für die Verwendung dieser Funktion konfiguriert ist.

Standardmäßig verwendet Android den Netzwerkzeitursprung als primären Ursprungsort für die automatische Zeiterkennung.

Netzwerkzeiterkennungssystem

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 zu erhalten. Der Dienst überwacht außerdem die Netzwerkkonnektivität und löst eine Zeitaktualisierung aus, wenn nach längeren Zeiträumen mit schlechter Konnektivität kein aktuelles Zeitsignal verfügbar ist.

Der Dienst network_time_update_service versucht, nach dem Booten und beim ersten Aufbau der Netzwerkverbindung ein Zeitsignal zu erhalten. Der Dienst versucht dann, das neueste Signal, das er besitzt, aktuell zu halten. Es gleicht die Bedürfnisse einzelner Android-Geräte mit der erheblichen Last aus, die durch die Auffrischung vieler Android-Geräte weltweit entstehen könnte.

Mithilfe interner APIs sendet network_time_update_service Netzwerkzeitvorschläge an den time_detector Dienst. Andere Android-Plattformkomponenten verwenden dann diese Netzwerkzeitvorschläge.

Nachdem er Vorschläge vom Netzwerkzeitursprung erhalten hat, bestimmt der time_detector Dienst, ob die Systemuhr gemäß den konfigurierten Priorisierungsregeln aktualisiert werden soll.

Um das automatische Zeiterkennungssystem so zu konfigurieren, dass es die Netzwerkursprungsvorschläge zum automatischen Einstellen der Systemuhr verwendet, verwenden Sie die Systemserver-Konfigurationsdatei core/res/res/values/config.xml . Stellen Sie sicher, dass das network in config_autoTimeSourcesPriority an der gewünschten Position enthalten ist. Einzelheiten finden Sie unter Zeitquellenpriorität .

Gerätekonfiguration

In diesem Abschnitt wird beschrieben, wie Gerätehersteller das Netzwerkzeiterkennungssystem 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 Nach einer fehlgeschlagenen Aktualisierung ist dies die Häufigkeit, mit der das System eine Netzwerkzeitabfrage mit einem kürzeren NTP-Abfrageintervall ( config_ntpPollingIntervalShorter ) versucht, bevor es einen Rückzieher macht und das normale Abfrageintervall ( config_ntpPollingInterval ) verwendet. Ein Wert kleiner als 0 bedeutet, dass das System die Abfrage im kürzeren NTP-Abfrageintervall wiederholt, bis die Aktualisierung erfolgreich durchgeführt werden kann.
config_ntpPollingInterval 64800000 (18 Stunden) Das normale Netzwerkzeitabfrageintervall in Millisekunden.
config_ntpPollingIntervalShorter 60000 (1 Minute) Das Zeitabfrageintervall für Wiederholungsversuche im Netzwerk in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt.
config_ntpServers Ein einzelner Eintrag: ntp://time.android.com NTP-Server zur Ermittlung einer genauen Uhrzeit. Elemente müssen das folgende Format haben: ntp://<host>[:port] .
Dies ist kein registriertes IANA-URI-Schema.
config_ntpTimeout 5000 Wartezeit auf eine NTP-Serverantwort in Millisekunden vor dem Timeout.

Server

Standardmäßig verwendet AOSP Zeitserver unter time.android.com , einem Alias ​​für Google Public NTP . Für diesen Dienst gibt es kein SLA. Weitere Informationen finden Sie in den häufig gestellten Fragen zu Google Public NTP .

Unterstützung mehrerer Server

Für Android 14 und höher unterstützt das Framework mehrere NTP-Server. Dies unterstützt Situationen, in denen Geräte weltweit mit einer einzigen Konfiguration verteilt sind, der Zugriff auf Server wie time.android.com jedoch an bestimmten Orten eingeschränkt ist.

Der Algorithmus probiert jeden im Konfigurationsschlüssel config_ntpServers angegebenen Server aus. Wenn es einen Server findet, der antwortet, verwendet das System diesen Server weiter, bis die Aktualisierung fehlschlägt oder das Gerät neu startet.

Genauigkeit

Die standardmäßige Netzwerkzeitsynchronisierung von Android verwendet SNTP mit einer einzigen Zeitabfrage etwa einmal am Tag, um sicherzustellen, dass immer ein aktuelles Zeitsignal vorhanden ist.

Netzwerklatenzeffekte tragen am meisten 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 dieselbe wie die Netzwerklatenz für die Antwort, und der richtige Zeitpunkt liegt genau in der Mitte dieses Netzwerk-Roundtrips. Die Netzwerk-Round-Trip-Zeit liegt oft in der Größenordnung von einigen hundert Millisekunden und in einem kabelgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Benutzer kaum wahrnehmbar sind. Allerdings gibt es bei der Mobil- oder Funktelefonie mehrere Phasen, in denen relativ lange, asymmetrische Verzögerungen in eine Netzwerktransaktion eingefügt werden können, was zu größerer Ungenauigkeit führt.

Wenn die AOSP-Standardeinstellung für config_ntpTimeout auf 5000 Millisekunden eingestellt ist und sich die gesamte Netzwerklatenz ausschließlich auf den eingehenden oder ausgehenden Abschnitt konzentriert, beträgt der maximale theoretische Fehler etwa 2,5 Sekunden.

Die Gesamtgenauigkeit der Systemuhr wird auch durch die Fähigkeit des Android-Geräts beeinflusst, die verstrichene Zeit genau zu verfolgen, nachdem ein Zeitsignal empfangen wurde. Dies ist ein Problem bei der gesamten Zeitmessung unter Android, nicht nur bei der Netzwerkzeiterkennung, und ist der Grund, warum der time_detector Dienst alte Zeitvorschläge ignoriert. Der Dienst network_time_update_service “ wird regelmäßig mithilfe des Intervalls config_ntpPollingInterval “ aktualisiert, um den Dienst „ time_detector “ mit aktuellen Zeitvorschlägen zu versorgen und um sicherzustellen, dass der Dienst time_detector nicht auf Zeitquellen mit niedrigerer Priorität und oft geringerer Genauigkeit oder gelegentlich falsche Zeitquellen wie telephony zurückgreift.

Wenn die automatische Zeiterkennung verwendet wird, kann die Genauigkeit der Systemuhr des Geräts durch andere Konfigurationen des time_detector Dienstes beeinträchtigt werden, z. B. durch die Konstanten und Flags, die beeinflussen, wie unterschiedlich ein Zeitvorschlag von der aktuellen Systemuhrzeit sein 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 Stromverbrauch durch häufigere Netzwerkvorgänge, der Auswirkungen auf auf dem Gerät ausgeführten Apps durch häufigere, aber kleinere Taktanpassungen und der Auswirkungen auf die Serverlast bewusst zu sein.

Andere Verwendungen der Netzwerkzeit

Wenn die automatische Zeiterkennung mithilfe des network nicht konfiguriert ist oder der Benutzer die automatische Zeiterkennung deaktiviert hat, wird die vom Dienst network_time_update_service erhaltene Zeit weiterhin von den folgenden Komponenten verwendet:

  • Die SystemClock.currentNetworkTimeClock() -Methode.
  • Interne Plattformfunktionen. Beispielsweise kann A-GPS einen ersten GNSS-Standort (Standort) schneller lokalisieren, wenn es über Netzwerkzeitinformationen verfügt.

Debuggen und Testen

Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Netzwerkzeiterkennungsfunktion beschrieben.

Interagieren Sie mit dem Dienst network_time_update_service

Um den aktuellen Status von network_time_update_service auszugeben, verwenden Sie:

adb shell cmd network_time_update_service dump

Um eine Reihe von Befehlszeilenoptionen anzuzeigen, die beim Testen hilfreich sein können, verwenden Sie Folgendes:

adb shell cmd network_time_update_service help