Обнаружение сетевого времени

Устройства Android автоматически пытаются получить правильное время эпохи Unix из сетевого источника. Android использует протокол SNTP, который использует протокол UDP, для получения информации о времени.

Компоненты, описанные на этой странице, являются частью системы автоматического определения времени, называемой источником сетевого времени . Сигнал времени с сетевого сервера времени можно использовать для установки системных часов устройства Android, если на устройстве поддерживается автоматическое определение времени и служба time_detector настроена на его использование.

По умолчанию Android использует источник сетевого времени в качестве основного источника автоматического определения времени.

Система определения сетевого времени

Служба network_time_update_service , работающая на системном сервере Android, реализует систему определения сетевого времени. Служба периодически использует SNTP для получения сигнала времени с сервера. Служба также контролирует сетевое подключение и запускает обновление времени, когда последний сигнал времени недоступен после длительных периодов плохого подключения.

Служба network_time_update_service пытается получить сигнал времени после загрузки и при первом установлении сетевого подключения. Затем служба пытается сохранить последний имеющийся у нее сигнал в актуальном состоянии. Он уравновешивает потребности отдельных устройств Android со значительной нагрузкой, которую могут создавать многие устройства Android по всему миру, освежающие свое время.

Используя внутренние API, network_time_update_service отправляет предложения по сетевому времени в службу time_detector . Другие компоненты платформы Android затем используют эти предложения по времени в сети.

После получения предложений от источника сетевого времени сервис time_detector определяет, следует ли обновлять системные часы в соответствии с настроенными правилами расстановки приоритетов .

Чтобы настроить систему автоматического определения времени на использование предложений сетевого происхождения для автоматической установки системных часов, используйте файл конфигурации системного сервера core/res/res/values/config.xml . Убедитесь, что network создания ценности содержится в config_autoTimeSourcesPriority в нужной позиции. Подробности см. в разделе «Приоритет источника времени ».

Конфигурация устройства

В этом разделе описывается, как производители устройств могут настроить систему определения времени сети.

Базовая конфигурация AOSP находится в frameworks/base/core/res/res/values/config.xml :

Конфигурационный ключ Значение AOSP Описание
config_ntpRetry 3 После неудачного обновления это количество раз, которое система пытается выполнить опрос сетевого времени с более коротким интервалом опроса NTP ( config_ntpPollingIntervalShorter ), прежде чем отступить и использовать обычный интервал опроса ( config_ntpPollingInterval ). Значение меньше 0 означает, что система повторяет опрос с более коротким интервалом опроса NTP, пока не сможет успешно обновиться.
config_ntpPollingInterval 64800000 (18 часов) Обычный интервал опроса времени сети в миллисекундах.
config_ntpPollingIntervalShorter 60000 (1 минута) Интервал повторного опроса сети в миллисекундах. Используется в случае сбоя обновления времени.
config_ntpServers Одна запись: ntp://time.android.com NTP-серверы, используемые для получения точного времени. Элементы должны быть в формате: ntp://<host>[:port] .
Это не зарегистрированная схема URI IANA.
config_ntpTimeout 5000 Время ожидания ответа NTP-сервера в миллисекундах до истечения времени ожидания.

Серверы

По умолчанию AOSP использует серверы времени по адресу time.android.com , который является псевдонимом Google Public NTP . У этой услуги нет соглашения об уровне обслуживания. Подробности см. в FAQ по публичному NTP Google .

Поддержка нескольких серверов

Для Android 14 и более поздних версий платформа поддерживает несколько серверов NTP. Это поддерживает ситуации, когда устройства распределены по всему миру с единой конфигурацией, но доступ к таким серверам, как time.android.com , ограничен в определенных местах.

Алгоритм проверяет каждый сервер, указанный в конфигурационном ключе config_ntpServers . Когда он находит тот, который отвечает, система продолжает использовать этот сервер до тех пор, пока он не перестанет обновляться или устройство не перезагрузится.

Точность

Сетевая синхронизация времени в Android по умолчанию использует SNTP с одним запросом времени примерно раз в день, чтобы обеспечить всегда наличие актуального сигнала времени.

Эффекты задержки в сети вносят наибольший вклад в неточность времени при реализации SNTP в Android. SNTP предполагает симметричные сетевые задержки, то есть задержка в сети для запроса такая же, как задержка в сети для ответа, а правильное время находится точно в середине этого обратного прохождения по сети. Часто время прохождения сигнала туда и обратно по сети составляет порядка нескольких сотен миллисекунд, а в проводной сети задержка близка к симметричной, что приводит к уровням неточностей, которые практически незаметны для пользователей. Однако в случае мобильной или радиотелефонии существует несколько этапов, на которых в сетевую транзакцию могут быть включены относительно длительные асимметричные задержки, что приводит к большей неточности.

Если для параметра AOSP по умолчанию для config_ntpTimeout установлено значение 5000 миллисекунд, и если вся задержка сети сосредоточена исключительно на входящем или исходящем участке, максимальная теоретическая ошибка составляет примерно 2,5 секунды.

На общую точность системных часов также влияет способность устройства Android точно отслеживать прошедшее время после получения сигнала времени. Это касается всего хронометража на Android, а не только определения времени в сети, и именно поэтому служба time_detector игнорирует предложения старого времени. Служба network_time_update_service регулярно обновляется с использованием интервала config_ntpPollingInterval , чтобы обеспечить службу time_detector свежими предложениями по времени и гарантировать, что служба time_detector не возвращается к источникам с более низким приоритетом и часто с более низкой точностью или иногда к неправильным источникам времени, таким как telephony .

Когда используется автоматическое определение времени, на точность системных часов устройства могут влиять другие конфигурации службы time_detector , такие как константы и флаги, которые влияют на то, насколько предложение времени должно отличаться от текущего времени системных часов до настройки часов ( ServiceConfigAccessorImpl.java ).

Производители устройств могут изменять точность, используя предыдущие параметры конфигурации и константы. Но важно помнить об ограничениях реализации SNTP на платформе, а также о потенциальном влиянии на энергопотребление от более частых сетевых операций, о влиянии на приложения, работающие на устройстве, от более частых, но меньших корректировок тактовой частоты, а также о влиянии на нагрузку на сервер.

Другое использование сетевого времени

Если автоматическое определение времени с использованием network источника не настроено или если пользователь отключил автоматическое определение времени, время, полученное службой network_time_update_service , по-прежнему используется следующими компонентами:

  • Метод SystemClock.currentNetworkTimeClock() .
  • Внутренние функции платформы. Например, A-GPS может быстрее определить местоположение GNSS (местоположения), если у него есть информация о времени сети.

Отладка и тестирование

В следующем разделе описаны команды оболочки для отладки и тестирования функции определения времени сети.

Взаимодействие со службой network_time_update_service

Чтобы сбросить текущее состояние network_time_update_service , используйте:

adb shell cmd network_time_update_service dump

Чтобы просмотреть набор параметров командной строки, которые могут помочь в тестировании, используйте:

adb shell cmd network_time_update_service help