Priorität der Zeitquelle

Das Android-Framework nutzt verschiedene Zeitquellen für die Zeitsynchronisierung. Auf dieser Seite geht es um die automatischen Zeitquellen des Network Time Protocol (NTP) und der Netzwerkidentität und -zeitzone (Network Identity and Time Zone, NITZ). In Android 12 und höher priorisiert das Framework NTP standardmäßig über NITZ, da NTP genauer und zuverlässiger als NITZ ist. In Situationen, in denen NTP nicht verfügbar ist, greift das Framework auf NITZ zurück. Dies ist eine Umkehrung der Standardpriorität früherer Versionen der Plattform. In Android 11 und niedriger priorisiert das Framework standardmäßig NITZ gegenüber NTP.

Weitere Informationen zu dieser Änderung finden Sie in den folgenden AOSP-Patches: 1563678, 1513323.

Priorität der Zeitquelle konfigurieren

Wenn Sie festlegen möchten, welche Zeitquelle für eine bestimmte Android-Version standardmäßig Priorität hat, konfigurieren Sie den Schlüssel config_autoTimeSourcesPriority während der Build-Erstellung in frameworks/base/core/res/res/values/config.xml. Zeitvorschläge von der Zeitquelle, die weiter oben in der Liste steht, haben Vorrang vor Quellen, die weiter unten in der Liste stehen.

Android-Zeitquellen, die konfiguriert werden können, finden Sie in TimeDetectorStrategy.java. Die folgenden Quellen sind standardmäßig zur Verwendung konfiguriert:

  • Telefonie (NITZ)
  • Netzwerk (NTP)

Testen

So prüfen Sie, ob das Gerät NITZ verwendet, wenn NTP nicht verfügbar ist (bei deaktivierten mobilen Daten und WLAN):

  1. Prüfen, ob sich eine funktionierende SIM im DUT befindet
  2. Mobile Daten und WLAN deaktivieren
  3. Versetzen Sie das Gerät in den Flugmodus, um die Mobilfunkverbindung auszuschalten.
  4. Automatische Zeiterkennung deaktivieren
  5. Stelle die Uhr manuell auf einen falschen Zeitwert in der Zukunft ein
  6. Gerät neu starten
  7. Automatische Zeiterkennung aktivieren
  8. Flugmodus deaktivieren

Diese Schritte lösen eine Änderung der Systemuhr aus, sobald ein NITZ-Signal empfangen wird. Führen Sie den folgenden Befehl aus, um zu prüfen, wie die Gerätezeit festgelegt ist:

adb shell dumpsys time_detector

Prüfen Sie in der Befehlsausgabe, ob die Systemuhr NITZ verwendet:

  • mEnvironment.isAutoTimeDetectionEnabled() ist true.
  • mEnvironment.autoOriginPriorities() enthält eine Liste von Zeitquellen, wobei Quellen weiter oben in der Liste Vorrang vor Quellen haben, die weiter unten auf der Liste stehen.
  • Der Abschnitt Time change log zeigt, dass die Systemuhr anhand eines Telefonievorschlags eingestellt wird.
  • Der Abschnitt Telephony suggestion history enthält Zeitvorschläge.
  • Der Abschnitt Network suggestion history ist leer.

Die Zeitvorschläge in den Abschnitten Telephony suggestion history und Network suggestion history gelten als zentrale Datenquelle. Wenn das Gerät mit dem Internet verbunden ist und eine SIM-Karte hat, werden Vorschläge über NTP (Netzwerk) und NITZ (Telefonie) generiert. In diesem Testfall enthält nur der Abschnitt Telephony suggestion history Vorschläge, da NTP deaktiviert ist.

Im Abschnitt Time change log werden die an der Systemuhr des Geräts vorgenommenen Änderungen und der verwendete Vorschlag aufgezeichnet. Die Systemuhr wird basierend auf der Reihenfolge der Zeitquellen in der Prioritätsliste im Schlüssel config_autoTimeSourcesPriority eingestellt. Vorschläge von einer Quelle mit höherer Priorität werden jedoch möglicherweise ignoriert, wenn der Vorschlag zu alt oder ungültig ist. Wenn der gültige Vorschlag mit der höchsten Priorität mit der aktuellen Systemuhrzeit des Geräts innerhalb weniger Sekunden übereinstimmt, wird die Zeit nicht geändert. In diesem Testfall wird die Systemuhr mit einem der Vorschläge aus dem Telephony suggestion history eingestellt, sofern die Vorschläge nicht veraltet sind.

Das folgende Beispiel zeigt eine Ausgabe, bei der das Gerät auf NITZ zurückgreift, wenn NTP nicht verfügbar ist.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

Zum Vergleich mit der Ausgabe im Testszenario ist das folgende Beispiel für eine typische Ausgabe, bei der das Gerät Zeitvorschläge von NTP- und NITZ-Zeitquellen erhält.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}