Wykrywanie czasu sieci

Urządzenia z Androidem automatycznie próbują uzyskać prawidłowy czas unixowy z ź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 sieciowego serwera czasu może być używany do ustawiania zegara systemowego urządzenia z Androidem, jeśli urządzenie z Androidem obsługuje automatyczne wykrywanie czasu, a usługa time_detector jest skonfigurowana tak, aby z niego korzystać.

Domyślnie Android używa źródła czasu sieci jako głównego źródła automatycznego wykrywania czasu.

System wykrywania czasu sieci

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 internetem 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 sieciowego usługa time_detectordecyduje, czy zaktualizować zegar systemowy zgodnie z skonfigurowanymi zasadami ustalania priorytetów.

Aby skonfigurować automatyczny system 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 opisano, 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 odświeży danych.
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 URI IANA.
config_ntpTimeout 5000 Czas oczekiwania na odpowiedź serwera NTP w milisekundach przed przekroczeniem limitu czasu.

Serwery

Domyślnie AOSP używa serwerów czasu pod adresem time.android.com, który 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 Androidzie 14 i nowszych platforma 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 dostęp do serwerów, takich jak time.android.com, jest w niektórych miejscach ograniczony.

Algorytm próbuje używać każdego serwera określonego w kluczu konfiguracji config_ntpServers. Po wykryciu, że serwer odpowiada, system nadal z niego korzysta, dopóki nie odświeży się ponownie lub urządzenie nie uruchomi się ponownie.

 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 w 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 łańcucha. 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 opóźnienia asymetryczne, 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 sieciowego. 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 będzie 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, na dokładność zegara systemu urządzenia mogą wpływać inne konfiguracje usługi time_detector, takie jak stałe i flagi wpływające na to, jak bardzo dana propozycja godziny musi się różnić od aktualnego zegara systemowego przed skorygowaniem zegara (ServiceConfigAccessorImpl.java).

Producenci urządzeń mogą modyfikować dokładność, korzystając z poprzednich opcji konfiguracji i stałych wartości. Warto jednak pamiętać o ograniczeniach implementacji SNTP na platformie oraz o potencjalnym wpływie na zużycie energii spowodowanym częstszymi operacjami sieciowymi, częstszymi, ale drobniejszymi regulacjami zegara na aplikacje oraz wpływem 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) w ramach pierwszego ustalania pozycji, jeśli ma informacje 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 skopiować bieżący stan instancji network_time_update_service, użyj polecenia:

adb shell cmd network_time_update_service dump

Aby zobaczyć zestaw opcji wiersza poleceń, które mogą pomóc w testowaniu, użyj:

adb shell cmd network_time_update_service help