Устройства 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
в нужной позиции. Подробности см. в разделе Time Source Priority .
Конфигурация устройства
В этом разделе описывается, как производители устройств могут настроить систему определения сетевого времени.
Базовая конфигурация AOSP находится в frameworks/base/core/res/res/values/config.xml
:
Конфигурационный ключ | Значение АОСП | Описание |
---|---|---|
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. Подробности см. в разделе FAQ 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