Das Android-Framework verwendet verschiedene Zeitquellen für die Zeitsynchronisierung. Auf dieser Seite liegt der Schwerpunkt auf den automatischen Zeitquellen Network Time Protocol (NTP) und Network Identity and Time Zone (NITZ). In Android 12 oder höher priorisiert das Framework standardmäßig NTP als Zeitquelle vor NITZ, da NTP genauer und zuverlässiger ist als NITZ. In Situationen, in denen NTP nicht verfügbar ist, greift das Framework auf NITZ zurück. Das ist eine Umkehrung der Standardpriorität aus früheren Versionen der Plattform. In Android 11 und niedriger priorisiert das Framework standardmäßig NITZ vor NTP.
Weitere Informationen zu dieser Änderung finden Sie in den folgenden AOSP-Patches: 1563678, 1513323.
Priorität der Zeitquelle konfigurieren
Wenn Sie konfigurieren möchten, welche Zeitquelle für eine bestimmte Android-Version standardmäßig priorisiert wird, konfigurieren Sie den Schlüssel config_autoTimeSourcesPriority
in frameworks/base/core/res/res/values/config.xml
zum Zeitpunkt des Builds. Vorschläge für die Uhrzeit von Zeitquellen, die weiter oben in der Liste stehen, 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 (wenn mobile Daten und WLAN deaktiviert sind):
- Achten Sie darauf, dass sich eine funktionierende SIM-Karte im DUT befindet.
- Mobile Daten und WLAN deaktivieren
- Versetzen Sie das Gerät in den Flugmodus, um sicherzustellen, dass das Mobilfunkradio deaktiviert ist.
- Automatische Zeiterkennung deaktivieren
- Stelle die Uhr manuell auf einen falschen Zeitwert in der Zukunft ein
- Gerät neu starten
- Automatische Zeiterkennung aktivieren
- Flugmodus auf dem Gerät deaktivieren
Diese Schritte lösen eine Änderung an 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, ob die Systemuhr NITZ verwendet. In der Befehlsausgabe muss Folgendes angezeigt werden:
mEnvironment.isAutoTimeDetectionEnabled()
isttrue
.mEnvironment.autoOriginPriorities()
enthält eine Liste von Zeitquellen. Quellen, die weiter oben in der Liste stehen, haben Vorrang vor Quellen, die weiter unten in der Liste stehen.- Der Abschnitt
Time change log
zeigt, dass die Systemuhr anhand eines Telefonievorschlags eingestellt wird. - Der Bereich
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 die maßgebliche Quelle für die Zeit. Wenn das Gerät mit dem Internet verbunden ist und eine SIM-Karte hat, werden Vorschläge sowohl mit NTP (Netzwerk) als auch mit NITZ (Telefonie) generiert. In diesem Testfall enthält nur der Bereich Telephony suggestion history
Vorschläge, da NTP deaktiviert ist.
Im Abschnitt Time change log
werden die Änderungen an der Systemuhr des Geräts und der verwendete Vorschlag aufgezeichnet. Die Systemuhr wird anhand der Reihenfolge der Zeitquellen in der Prioritätsliste im Schlüssel config_autoTimeSourcesPriority
festgelegt. Vorschläge aus einer Quelle mit höherer Priorität werden jedoch möglicherweise ignoriert, wenn sie zu alt oder ungültig sind.
Wenn der gültige Vorschlag mit der höchsten Priorität innerhalb weniger Sekunden mit der aktuellen Systemuhrzeit des Geräts übereinstimmt, wird die Zeit nicht geändert.
In diesem Testfall wird die Systemuhr mit einem der Vorschläge aus der Telephony suggestion history
eingestellt, sofern die Vorschläge nicht veraltet sind.
Im Folgenden sehen Sie ein Beispiel für 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}