Urządzenia z Androidem automatycznie próbują uzyskać prawidłowy czas epoki Unixa ze źródła sieciowego. Android używa protokołu SNTP, który korzysta z protokołu UDP, do uzyskiwania informacji o czasie.
Komponenty opisane na tej stronie stanowią część automatycznego systemu wykrywania czasu, zwanego źródłem czasu sieci. sygnał czasu z serwera czasu sieciowego może służyć do ustawiania zegara systemowego urządzenia z Androidem, jeśli urządzenie obsługuje automatyczne wykrywanie czasu, a usługa time_detector
jest skonfigurowana do jego używania.
Domyślnie Android używa źródła czasu sieci jako głównego źródła automatycznego wykrywania czasu.
System wykrywania czasu sieciowego
Usługa network_time_update_service
, która działa na serwerze systemowym Androida, implementuje system wykrywania czasu sieci. Usługa okresowo używa protokołu SNTP do uzyskiwania sygnału czasowego z serwera. Usługa ta monitoruje też połączenie z siecią i uruchamia odświeżanie czasu, gdy po dłuższym okresie słabego połączenia nie jest dostępny najnowszy sygnał czasu.
Usługa network_time_update_service
próbuje uzyskać sygnał czasu po uruchomieniu i po pierwszym nawiązaniu połączenia z internetem. Usługa stara się wtedy zachować najnowszy sygnał. Uwzględnia ona potrzeby poszczególnych urządzeń z Androidem oraz znaczne obciążenie, które może być generowane przez wiele urządzeń z Androidem na całym świecie, które odświeżają czas.
Korzystając z wewnętrznych interfejsów API, network_time_update_service
przesyła sugestie dotyczące czasu sieci do usługi time_detector
. Inne komponenty platformy Android korzystają z tych sugestii dotyczących czasu sieci.
Po otrzymaniu sugestii od źródła czasu sieci usługa time_detector
decyduje, czy zaktualizować zegar systemowy zgodnie z skonfigurowanymi zasadami ustalania priorytetów.
Aby skonfigurować system automatycznego wykrywania czasu w celu automatycznego ustawiania zegara systemowego za pomocą sugestii z sieci, użyj pliku konfiguracyjnego serwera systemu core/res/res/values/config.xml
. Upewnij się, że wartość network
znajduje się w elementach config_autoTimeSourcesPriority
w pożądanej pozycji. Więcej informacji znajdziesz w artykule Priorytet źródła czasu.
Konfiguracja urządzenia
W tej sekcji opisaliśmy, jak producenci urządzeń mogą skonfigurować system wykrywania czasu sieci.
Podstawowa konfiguracja AOSP znajduje się na stronie frameworks/base/core/res/res/values/config.xml
:
Klucz konfiguracji | Wartość AOSP | Opis |
---|---|---|
config_ntpRetry |
3 |
Po nieudanej próbie odświeżenia system próbuje ponownie uzyskać czas sieciowy, używając krótszego interwału pollingu NTP (config_ntpPollingIntervalShorter ), zanim użyje normalnego interwału pollingu (config_ntpPollingInterval ). Wartość mniejsza niż 0 oznacza, że system powtarza próbę pollingu przy krótszym interwale pollingu NTP, dopóki nie uda mu się odświeżyć. |
config_ntpPollingInterval |
64800000 (18 godzin) |
Normalny interwał odpytywania czasu sieci w milisekundach. |
config_ntpPollingIntervalShorter |
60000 (1 minuta) |
Polling interwał czasu próby ponownego połączenia w milisekundach. Używany, gdy odświeżanie nie powiedzie się. |
config_ntpServers |
Pojedynczy wpis: ntp://time.android.com |
serwery NTP, których należy używać do uzyskiwania dokładnego czasu. Elementy muszą mieć format:
ntp://<host>[:port] .
To nie jest zarejestrowany schemat identyfikatora URI IANA. |
config_ntpTimeout |
5000 | Czas oczekiwania na odpowiedź serwera NTP (w milisekundach) przed upływem limitu czasu. |
Serwery
Domyślnie AOSP używa serwerów czasu na stronie time.android.com
, która jest aliasem publicznego protokołu NTP Google. Ta usługa nie ma gwarancji jakości usług. Szczegółowe informacje znajdziesz w najczęstszych pytaniach dotyczących publicznego protokołu NTP Google.
Obsługa wielu serwerów
W przypadku Androida 14 lub nowszego framework obsługuje wiele serwerów NTP. Ta funkcja jest przydatna w sytuacjach, gdy urządzenia są rozprowadzane na całym świecie z jedną konfiguracją, ale w określonych miejscach dostęp do serwerów, takich jak time.android.com
, jest ograniczony.
Algorytm próbuje użyć każdego serwera określonego w kluczu konfiguracji config_ntpServers
. Gdy znajdzie serwer, który odpowiada, system będzie go używać, dopóki nie przestanie się on odświeżać lub nie nastąpi ponowne uruchomienie urządzenia.
Dokładność
Domyślne synchronizowanie czasu sieci w Androidzie używa SNTP z pojedynczym zapytaniem o czas około raz dziennie, aby zapewnić aktualny sygnał czasu.
Opóźnienia w sieci mają największy wpływ na niedokładność czasu w implementacji SNTP na Androidzie. SNTP zakłada opóźnienia sieciowe o symetrycznych wartościach, czyli opóźnienie sieciowe żądania jest takie samo jak opóźnienie sieciowe odpowiedzi, a właściwy czas znajduje się dokładnie w połowie tego okna. Czas przesyłania pakietów w sieci w obie strony wynosi często kilkaset milisekund, a w sieci przewodowej opóźnienie jest prawie symetryczne, co powoduje, że niedokładności są prawie niezauważalne dla użytkowników. W przypadku telefonii komórkowej lub radiowej występują jednak etapy, na których w transakcji sieciowej mogą występować stosunkowo długie, asymetryczne opóźnienia, co prowadzi do większej niedokładności.
Gdy domyślne ustawienie AOSP dla parametru config_ntpTimeout
wynosi 5000
ms, a cała opóźnienie sieci jest skoncentrowane tylko na połączeniu przychodzącym lub wychodzącym, maksymalny teoretyczny błąd wynosi około 2,5 s.
Na ogólną dokładność zegara systemowego wpływa również zdolność urządzenia z Androidem do dokładnego śledzenia upływu czasu po uzyskaniu sygnału czasowego. Dotyczy to wszystkich funkcji związanych z czasem w Androidzie, a nie tylko wykrywania czasu sieci. Dlatego usługa time_detector
ignoruje stare sugestie dotyczące czasu. Usługa network_time_update_service
jest regularnie odświeżana co config_ntpPollingInterval
, aby dostarczać aktualne informacje o czasie. Dzięki temu usługa time_detector
nie korzysta z źródeł czasu o niższym priorytecie i często niższej dokładności lub czasami błędnych źródeł czasu, takich jak telephony
.time_detector
Gdy używane jest automatyczne wykrywanie czasu, dokładność zegara systemowego urządzenia może być zależna od innych konfiguracji usługi time_detector
, takich jak stałe i flagi, które wpływają na to, jak bardzo propozycja czasu różni się od bieżącego czasu zegara systemowego przed jego dostosowaniem (ServiceConfigAccessorImpl.java
).
Producenci urządzeń mogą modyfikować dokładność, korzystając z poprzednich opcji konfiguracji i stałych wartości. Należy jednak pamiętać o ograniczeniach implementacji SNTP na platformie oraz o potencjalnym wpływie częstszych operacji sieciowych na zużycie energii, wpływie na aplikacje działające na urządzeniu z powodu częstszych, ale mniejszych korekt zegara oraz wpływie na obciążenie serwera.
Inne zastosowania czasu sieciowego
Jeśli automatyczne wykrywanie czasu za pomocą źródła network
nie jest skonfigurowane lub użytkownik wyłączył automatyczne wykrywanie czasu, czas uzyskany przez usługę network_time_update_service
jest nadal używany przez te komponenty:
- metoda
SystemClock.currentNetworkTimeClock()
. - Wewnętrzne funkcje platformy. Na przykład A-GPS może szybciej określić lokalizację GNSS (lokalizacja) na podstawie pierwszych danych o czasie sieci.
Debugowanie i testowanie
W tej sekcji opisano polecenia powłoki służące do debugowania i testowania funkcji wykrywania czasu w sieci.
Interakcja z usługą network_time_update_service
Aby wygenerować bieżący stan network_time_update_service
, użyj:
adb shell cmd network_time_update_service dump
Aby wyświetlić zestaw opcji wiersza poleceń, które mogą ułatwić testowanie, użyj:
adb shell cmd network_time_update_service help