Wykrywanie czasu w sieci

Urządzenia z Androidem automatycznie próbują uzyskać prawidłowy czas epoki Uniksa ze źródła sieciowego. Android używa protokołu SNTP, który wykorzystuje protokół UDP, do uzyskiwania informacji o czasie.

Komponenty opisane na tej stronie stanowią część systemu automatycznego wykrywania czasu, zwanego sieciowym pochodzeniem czasu . Sygnału czasu z sieciowego serwera czasu można użyć do ustawienia zegara systemowego urządzenia z systemem Android, jeśli urządzenie obsługuje automatyczne wykrywanie czasu i skonfigurowano usługę time_detector do jej używania.

Domyślnie system Android używa czasu sieciowego jako podstawowego źródła automatycznego wykrywania czasu.

Sieciowy system wykrywania czasu

Usługa network_time_update_service działająca na serwerze systemu Android implementuje system detekcji czasu sieciowego. Usługa okresowo korzysta z protokołu SNTP w celu uzyskania sygnału czasu z serwera. Usługa monitoruje także łączność sieciową i uruchamia odświeżanie czasu, gdy po dłuższych okresach słabej łączności nie jest dostępny sygnał ostatniej godziny.

Usługa network_time_update_service próbuje uzyskać sygnał czasu po uruchomieniu i po pierwszym nawiązaniu połączenia sieciowego. Usługa następnie stara się, aby najnowszy sygnał był aktualny. Równoważy potrzeby poszczególnych urządzeń z Androidem ze znacznym obciążeniem, jakie może generować wiele urządzeń z Androidem na całym świecie odświeżając swój czas.

Korzystając z wewnętrznych interfejsów API, network_time_update_service przesyła sugestie dotyczące czasu sieciowego do usługi time_detector . Inne komponenty platformy Android korzystają z tych sugestii dotyczących czasu sieci.

Po otrzymaniu sugestii od sieciowego źródła czasu, usługa time_detector określa, czy zaktualizować zegar systemowy zgodnie ze skonfigurowanymi regułami ustalania priorytetów .

Aby skonfigurować system automatycznego wykrywania czasu do korzystania z sugestii dotyczących pochodzenia sieci w celu automatycznego ustawiania zegara systemowego, użyj pliku konfiguracyjnego serwera systemowego core/res/res/values/config.xml . Upewnij się, że network wartości jest zawarta w config_autoTimeSourcesPriority w żądanej pozycji. Aby uzyskać szczegółowe informacje, zobacz Priorytet źródła czasu .

Konfiguracja urzadzenia

W tej sekcji opisano, w jaki sposób producenci urządzeń mogą konfigurować system wykrywania czasu w sieci.

Podstawowa konfiguracja AOSP znajduje się w frameworks/base/core/res/res/values/config.xml :

Klucz konfiguracyjny Wartość AOSP Opis
config_ntpRetry 3 Po niepowodzeniu odświeżenia jest to liczba prób odpytywania czasu sieciowego przez system z krótszym interwałem odpytywania NTP ( config_ntpPollingIntervalShorter ), zanim wycofa się i użyje normalnego interwału odpytywania ( config_ntpPollingInterval ). Wartość mniejsza niż 0 oznacza, że ​​system ponawia odpytywanie z krótszym interwałem odpytywania NTP, dopóki nie będzie w stanie pomyślnie odświeżyć.
config_ntpPollingInterval 64800000 (18 godzin) Normalny interwał odpytywania czasu sieci w milisekundach.
config_ntpPollingIntervalShorter 60000 (1 minuta) Interwał sondowania czasu ponownej próby sieci w milisekundach. Używane, gdy odświeżanie czasu nie powiedzie się.
config_ntpServers Pojedynczy wpis: ntp://time.android.com Serwery NTP do wykorzystania w celu uzyskania dokładnego czasu. Elementy muszą mieć postać: ntp://<host>[:port] .
To nie jest zarejestrowany schemat URI IANA.
config_ntpTimeout 5000 Czas oczekiwania na odpowiedź serwera NTP w milisekundach przed upływem limitu czasu.

Serwery

Domyślnie AOSP korzysta z serwerów czasu pod time.android.com , który jest aliasem dla Google Public NTP . Ta usługa nie jest objęta umową SLA. Szczegółowe informacje można znaleźć w często zadawanych pytaniach dotyczących publicznego protokołu NTP Google .

Obsługa wielu serwerów

W przypadku Androida 14 i nowszych framework obsługuje wiele serwerów NTP. Obsługuje to sytuacje, w których urządzenia są dystrybuowane globalnie z jedną konfiguracją, ale dostęp do serwerów takich jak time.android.com jest ograniczony w niektórych miejscach.

Algorytm sprawdza każdy serwer określony w kluczu konfiguracyjnym config_ntpServers . Gdy znajdzie taki, który odpowiada, system kontynuuje korzystanie z tego serwera, aż do momentu, w którym nie uda się go odświeżyć lub urządzenie nie zostanie ponownie uruchomione.

Dokładność

Domyślna synchronizacja czasu w sieci w systemie Android używa protokołu SNTP z pojedynczym zapytaniem o godzinę mniej więcej raz dziennie, aby mieć pewność, że zawsze dostępny jest aktualny sygnał czasu.

Efekty opóźnień sieci są największym czynnikiem powodującym niedokładność czasu w przypadku implementacji SNTP w systemie Android. Protokół SNTP zakłada symetryczne opóźnienia sieci, co oznacza, że ​​opóźnienie sieci dla żądania jest takie samo, jak opóźnienie sieci w przypadku odpowiedzi, a prawidłowy czas leży dokładnie w środku ruchu w obie strony sieci. Często czas podróży w obie strony w sieci wynosi kilkaset milisekund, a w sieci przewodowej opóźnienie jest bliskie symetryczne, co prowadzi do poziomów niedokładności, które są prawie niezauważalne dla użytkowników. Jednakże w przypadku telefonii komórkowej lub radiowej istnieje kilka etapów, w których do transakcji sieciowej można wprowadzić stosunkowo długie, asymetryczne opóźnienia, co prowadzi do większej niedokładności.

Przy domyślnym ustawieniu AOSP dla config_ntpTimeout ustawionym na 5000 milisekund i jeśli całe opóźnienie sieci koncentruje się wyłącznie na odcinku przychodzącym lub wychodzącym, maksymalny teoretyczny błąd wynosi około 2,5 sekundy.

Na ogólną dokładność zegara systemowego wpływa także zdolność urządzenia z systemem Android do dokładnego śledzenia czasu, jaki upłynął po uzyskaniu sygnału czasu. Jest to problem związany z całym pomiarem czasu w systemie Android, a nie tylko z wykrywaniem czasu w sieci, i dlatego usługa time_detector ignoruje stare sugestie dotyczące czasu. Usługa network_time_update_service odświeża się regularnie przy użyciu interwału config_ntpPollingInterval , aby zapewnić usłudze time_detector dostarczanie świeżych sugestii dotyczących czasu i zapewnić, że usługa time_detector nie powróci do źródeł czasu o niższym priorytecie i często o niższej dokładności lub czasami nieprawidłowych, takich jak telephony .

Gdy używane jest automatyczne wykrywanie czasu, na dokładność zegara systemowego urządzenia mogą mieć wpływ inne konfiguracje usługi time_detector , takie jak stałe i flagi wpływające na to, jak bardzo sugestia czasu musi różnić się od bieżącego czasu zegara systemowego przed dostosowaniem zegara ( ServiceConfigAccessorImpl.java ).

Producenci urządzeń mogą modyfikować dokładność, korzystając z powyższych opcji konfiguracyjnych i stałych. Należy jednak zdawać sobie sprawę z ograniczeń implementacji protokołu SNTP na platformie oraz potencjalnego wpływu częstszych operacji sieciowych na zużycie energii, częstszego, ale mniejszego wpływu na aplikacje działające na urządzeniu, a także wpływu na obciążenie serwera.

Inne zastosowania czasu sieciowego

Jeżeli nie skonfigurowano automatycznego wykrywania czasu przy użyciu źródła network lub jeśli użytkownik wyłączył automatyczne wykrywanie czasu, czas uzyskany przez usługę network_time_update_service jest w dalszym ciągu wykorzystywany przez następujące komponenty:

  • Metoda SystemClock.currentNetworkTimeClock() .
  • Wewnętrzne funkcje platformy. Na przykład A-GPS może szybciej zlokalizować pierwszą pozycję GNSS (lokalizacji), jeśli ma informacje o czasie sieciowym.

Debugowanie i testowanie

W poniższej sekcji opisano polecenia powłoki służące do debugowania i testowania funkcji wykrywania czasu sieciowego.

Wejdź w interakcję z usługą network_time_update_service

Aby zrzucić bieżący stan network_time_update_service , użyj:

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