Priorität der Zeitquelle

Das Android-Framework nutzt verschiedene Zeitquellen für die Zeitsynchronisierung. Auf dieser Seite geht es um das Network Time Protocol (NTP) und Automatische NITZ-Zeitquellen (Network Identity and Time Zone). In Android 12 und höher ist das Framework priorisiert NTP als Zeitquelle gegenüber NITZ, da NTP genauer und zuverlässiger als das NITZ. 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 des Plattform. In Android 11 und niedriger priorisiert das Framework standardmäßig NITZ. über NTP an.

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

Priorität der Zeitquelle konfigurieren

Um zu konfigurieren, welche Zeitquelle standardmäßig für ein bestimmtes Android-Gerät Priorität hat Version, konfigurieren Sie die config_autoTimeSourcesPriority Schlüssel in frameworks/base/core/res/res/values/config.xml bei der Build-Erstellung. Uhrzeit Vorschläge aus der Zeitquelle, die weiter oben in der Liste steht, haben Vorrang die weiter unten in der Liste stehen.

Die 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

Überprüfung, ob das Gerät NITZ verwendet, wenn NTP nicht verfügbar ist Gehen Sie so vor, wenn mobile Daten und WLAN deaktiviert sind:

  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 eine NITZ-Datei Signal empfangen wird. Führen Sie folgenden Befehl aus, um zu prüfen, wie die Uhrzeit auf dem Gerät eingestellt ist Befehl:

adb shell dumpsys time_detector

Um zu überprüfen, ob die Systemuhr NITZ verwendet, bestätigen Sie Folgendes im Befehl Ausgabe:

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

Die Zeitvorschläge in Telephony suggestion history und Network suggestion history Abschnitt gilt als Informationsquelle für . Wenn das Gerät mit dem Internet verbunden ist und eine SIM-Karte verwendet wird, werden mit NTP (Netzwerk) und NITZ (Telefonie) generiert. In diesem Testfall nur der Abschnitt Telephony suggestion history enthält Vorschläge, NTP ist deaktiviert.

Im Abschnitt Time change log werden die Änderungen erfasst, die an der Systemuhr und dem verwendeten Vorschlag. Die Systemuhr wird basierend auf dem in der Reihenfolge der Zeitquellen in der Prioritätenliste den config_autoTimeSourcesPriority-Schlüssel. Vorschläge von einem Quelle mit höherer Priorität wird möglicherweise ignoriert, wenn der Vorschlag zu alt oder ungültig ist. Wenn der gültige Vorschlag mit der höchsten Priorität mit dem aktuellen Die Systemuhrzeit auf wenige Sekunden ändert sich nicht. Sofern die Vorschläge nicht veraltet sind, wird in diesem Testfall die Systemuhr wird mit einem der Vorschläge aus Telephony suggestion history festgelegt.

Das folgende Beispiel zeigt eine Ausgabe, bei der das Gerät auf die Verwendung von NITZ, 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 enthält der Parameter Hier ist ein Beispiel für eine typische Ausgabe, bei der das Gerät erhält Zeitvorschläge von NTP- und NITZ-Zeitquellen.

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}