Platforma Androida używa różnych źródeł czasu do synchronizacji czasu. Na tej stronie skupimy się na automatycznych źródłach czasu, czyli protokole czasu sieciowego (NTP) oraz sieciowej tożsamości i strefie czasowej (NITZ). W Androidzie 12 lub nowszym platforma domyślnie traktuje NTP jako źródło czasu o wyższym priorytecie niż NITZ, ponieważ NTP jest dokładniejszy i bardziej niezawodny niż NITZ. W sytuacjach, w których NTP nie jest dostępny, platforma korzysta z NITZ. Jest to odwrócenie domyślnego priorytetu z wcześniejszych wersji platformy. W Androidzie 11 i starszych wersjach platforma domyślnie nadaje priorytet NITZ przed NTP.
Więcej informacji o tej zmianie znajdziesz w tych poprawkach AOSP: 1563678, 1513323.
Konfigurowanie priorytetu źródła czasu
Aby skonfigurować, które źródło czasu ma domyślnie wyższy priorytet w przypadku konkretnej wersji Androida, skonfiguruj klucz config_autoTimeSourcesPriority w frameworks/base/core/res/res/values/config.xml podczas kompilacji. Sugestie dotyczące czasu pochodzące ze źródła czasu, które znajduje się wyżej na liście, mają pierwszeństwo przed źródłami znajdującymi się niżej na liście.
Konfigurowalne źródła czasu Androida znajdziesz w TimeDetectorStrategy.java.
Domyślnie skonfigurowane są te źródła:
- Połączenia telefoniczne (NITZ)
- Sieć (NTP)
Testowanie
Aby sprawdzić, czy urządzenie korzysta z NITZ, gdy NTP jest niedostępny (gdy mobilna transmisja danych i Wi-Fi są wyłączone):
- Sprawdź, czy w urządzeniu znajduje się działająca karta SIM.
- Wyłączanie mobilnej transmisji danych i Wi-Fi
- Włącz na urządzeniu tryb samolotowy, aby wyłączyć radio komórkowe.
- Wyłączanie automatycznego wykrywania czasu
- Ręcznie ustaw nieprawidłową godzinę w przyszłości.
- Uruchom ponownie urządzenie
- Włączanie automatycznego wykrywania czasu
- Wyłącz tryb samolotowy na urządzeniu.
Te czynności powodują zmianę zegara systemowego natychmiast po odebraniu sygnału NITZ. Aby sprawdzić, jak ustawiony jest czas na urządzeniu, uruchom to polecenie:
adb shell dumpsys time_detectorAby sprawdzić, czy zegar systemowy korzysta z NITZ, w danych wyjściowych polecenia sprawdź te informacje:
- Obecny stan „
mEnvironment.isAutoTimeDetectionEnabled()”:true. mEnvironment.autoOriginPriorities()zawiera listę źródeł czasu. Źródła znajdujące się wyżej na liście mają wyższy priorytet niż źródła znajdujące się niżej.- Sekcja
Time change logpokazuje, że zegar systemowy jest ustawiony na podstawie sugestii dotyczącej telefonii. - Sekcja
Telephony suggestion historyzawiera propozycje terminu. - Sekcja
Network suggestion historyjest pusta.
Sugerowane godziny w sekcjach Telephony suggestion history i Network suggestion history są uznawane za źródło informacji o czasie. Jeśli urządzenie jest połączone z internetem i ma kartę SIM, sugestie są generowane przy użyciu zarówno NTP (sieć), jak i NITZ (telefonia). W tym przypadku sugestie zawiera tylko sekcja Telephony suggestion history, ponieważ strona nowej karty jest wyłączona.
W sekcji Time change log zapisywane są zmiany wprowadzone w zegarze systemowym urządzenia oraz użyta sugestia. Zegar systemowy jest ustawiany na podstawie kolejności źródeł czasu na liście priorytetów w config_autoTimeSourcesPriority. Sugestie ze źródła o wyższym priorytecie mogą jednak zostać zignorowane, jeśli są zbyt stare lub nieprawidłowe.
Jeśli ponadto sugestia o najwyższym priorytecie pasuje do bieżącego czasu zegara systemowego urządzenia z dokładnością do kilku sekund, czas nie zostanie zmieniony.
W tym przypadku, o ile sugestie nie są nieaktualne, zegar systemowy jest ustawiany na podstawie jednej z sugestii z Telephony suggestion history.
Oto przykład danych wyjściowych, w których urządzenie wraca do korzystania z NITZ, gdy NTP jest niedostępny.
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 typowych danych wyjściowych, w których urządzenie otrzymuje sugestie dotyczące czasu ze źródeł NTP i NITZ. Możesz go użyć jako punktu odniesienia do porównania z danymi wyjściowymi w scenariuszu testowym.
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}