Framework Androida używa różnych źródeł czasu do synchronizacji czasu. Ta strona dotyczy automatycznych źródeł czasu związanych z protokołem Network Time Protocol (NTP) oraz tożsamością sieciową i strefą czasową (NITZ). Domyślnie w Androidzie 12 lub nowszym framework preferuje NTP jako źródło czasu zamiast NITZ, ponieważ NTP jest dokładniejszy i bardziej niezawodny niż NITZ. W sytuacjach, gdy serwer NTP jest niedostępny, framework korzysta z serwera NITZ. To cofnięcie domyślnego priorytetu z wcześniejszych wersji platformy. Domyślnie w Androidzie 11 i starszych framework daje priorytet NITZ nad NTP.
Więcej informacji o tej zmianie znajdziesz w tych poprawkach AOSP: 1563678, 1513323.
Konfigurowanie priorytetu źródła czasu
Aby określić, które źródło czasu ma domyślnie priorytet dla określonej wersji Androida, skonfiguruj klucz config_autoTimeSourcesPriority
w frameworks/base/core/res/res/values/config.xml
podczas kompilacji. Propozycje dotyczące czasu ze źródła, które znajduje się wyżej na liście, mają pierwszeństwo przed propozycjami ze źródeł znajdujących się niżej na liście.
Źródła czasu Androida, które można skonfigurować, znajdują się w sekcji TimeDetectorStrategy.java
.
Domyślnie używane są te źródła:
- Telefonia (NITZ)
- Sieć (NTP)
Testowanie
Aby sprawdzić, czy urządzenie korzysta z NITZ, gdy NTP jest niedostępne (gdy mobilna transmisja danych i Wi-Fi są wyłączone), wykonaj te czynności:
- Upewnij się, że w badanym urządzeniu jest karta SIM, która działa
- Wyłącz mobilną transmisję danych i Wi-Fi
- Włącz na urządzeniu tryb samolotowy, aby mieć pewność, że radio komórkowe jest wyłączone.
- Wyłączanie automatycznego wykrywania czasu
- Ręczne ustawienie zegara na nieprawidłową wartość czasu w przyszłości
- Uruchom ponownie urządzenie.
- Włączanie automatycznego wykrywania czasu
- Wyłącz tryb samolotowy
Te kroki powodują zmianę zegara systemowego po otrzymaniu sygnału NITZ. Aby sprawdzić, jak czas urządzenia jest ustawiony, uruchom to polecenie:
adb shell dumpsys time_detector
Aby sprawdzić, czy zegar systemowy używa NITZ, sprawdź te informacje w wyniku polecenia:
mEnvironment.isAutoTimeDetectionEnabled()
:true
.mEnvironment.autoOriginPriorities()
zawiera listę źródeł czasu, przy czym źródła znajdujące się wyżej na liście mają pierwszeństwo przed źródłami znajdującymi się niżej na liście.- Sekcja
Time change log
pokazuje, że zegar systemowy jest ustawiany przy użyciu sugestii telefonii. - Sekcja
Telephony suggestion history
zawiera propozycje czasu. - Sekcja
Network suggestion history
jest pusta.
Propozycje dotyczące czasu w sekcjach Telephony suggestion history
i Network suggestion history
są uważane za źródło danych podstawowych dotyczące czasu. Jeśli urządzenie jest połączone z internetem i ma kartę SIM, sugestie są generowane za pomocą protokołu NTP (Network Time Protocol) i NITZ (Network Time Protocol). W tym przypadku testowym tylko sekcja Telephony suggestion history
zawiera sugestie, ponieważ protokół NTP jest wyłączony.
Sekcja Time change log
zawiera informacje o zmianach wprowadzonych w systemowym zegarku urządzenia oraz o użytej sugestii. Zegar systemowy jest ustawiany na podstawie kolejności źródeł czasu na liście priorytetów w kluczu config_autoTimeSourcesPriority
. Jednak sugestie ze źródła o wyższym priorytecie mogą zostać zignorowane, jeśli są zbyt stare lub nieprawidłowe.
Poza tym, jeśli prawidłowa sugestia o najwyższym priorytecie pasuje do aktualnego zegara systemowego urządzenia z dokładnością do kilku sekund, czas się nie zmieni.
W tym przypadku, o ile sugestie są aktualne, zegar systemowy jest ustawiany na podstawie jednej z sugestii Telephony suggestion history
.
Poniżej znajdziesz przykład danych wyjściowych, po których urządzenie powróci do korzystania z NITZ, gdy NTP jest niedostępne.
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}
Poniżej znajdziesz przykład typowego wyniku, w którym urządzenie otrzymuje propozycje czasu z źródeł czasu NTP i NITS.
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}