Android 设备会自动尝试从网络源获取正确的 Unix 纪元时间。Android 使用 SNTP 协议(该协议使用 UDP 协议)来获取时间信息。
本页介绍的组件是称为网络时间来源的自动时间检测系统的一部分。当设备支持自动时间检测并且 time_detector
服务配置为使用网络时间信号时,可以使用来自网络时间服务器的时间信号来设置 Android 设备的系统时钟。
默认情况下,Android 使用网络时间来源作为主要的自动时间检测来源。
网络时间检测系统
在 Android 系统服务器中运行的 network_time_update_service
服务实现了网络时间检测系统。该服务会定期使用 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 |
刷新失败后,系统在退避并使用正常轮询间隔 (config_ntpPollingInterval ) 之前,尝试使用较短的 NTP 轮询间隔 (config_ntpPollingIntervalShorter ) 进行网络时间轮询的次数。小于 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 公共 NTP 的别名。此服务没有 SLA。有关详情,请参阅 Google 公共 NTP 常见问题解答。
多服务器支持
对于 Android 14 及更高版本,框架支持多个 NTP 服务器。这支持在设备以单一配置在全球范围内分发,但在某些地方访问诸如 time.android.com
等服务器受到限制的情况。
该算法会尝试 config_ntpServers
配置键中指定的每个服务器。当找到一个响应的服务器时,系统会继续使用该服务器,直到刷新失败或设备重启。
准确性
Android 的默认网络时间同步使用 SNTP,大约每天进行一次时间查询,以尝试确保它始终具有最新的时间信号。
网络延迟效应是导致 Android SNTP 实现的时间不准确的最大因素。SNTP 假设网络延迟是对称的,即请求的网络延迟与响应的网络延迟相同,并且正确的时间正好位于网络往返的中间。通常,网络往返时间约为几百毫秒,并且在有线网络上,延迟接近对称,导致用户几乎无法察觉的不准确程度。但是,对于移动或无线电话,在网络事务中可能会插入几个阶段的相对较长、不对称的延迟,从而导致更大的不准确性。
在 config_ntpTimeout
设置为 5000
毫秒的 AOSP 默认设置下,如果所有网络延迟都完全集中在入站或出站链路中,则最大理论误差约为 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(位置)首次修复。
调试和测试
以下部分介绍用于调试和测试网络时间检测功能的 Shell 命令。
与 network_time_update_service 服务交互
要转储 network_time_update_service
的当前状态,请使用
adb shell cmd network_time_update_service dump
要查看一组可帮助进行测试的命令行选项,请使用
adb shell cmd network_time_update_service help