Определение времени сети

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

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

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

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

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

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

network_time_update_service , используя внутренние API, отправляет предложения по сетевому времени службе 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] .
Это не зарегистрированная схема IANA URI.
config_ntpTimeout 5000 Время ожидания ответа NTP-сервера в миллисекундах до тайм-аута.

Серверы

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

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

В 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