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_ntpPollingIntervalShorter ) 之前尝试使用较短 NTP 轮询间隔 ( 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 公共 NTP 常见问题解答。
多服务器支持
对于 Android 14 及更高版本,该框架支持多个 NTP 服务器。这支持设备通过单一配置分布在全球的情况,但对服务器(例如time.android.com
的访问在某些地方受到限制。
该算法会尝试config_ntpServers
配置项中指定的每个服务器。当找到响应的服务器时,系统将继续使用该服务器,直到刷新失败或设备重新启动。
准确性
Android 的默认网络时间同步使用 SNTP 和大约每天一次的单次时间查询,以尝试确保它始终具有最近的时间信号。
网络延迟效应是 Android 的 SNTP 实现时间不准确的最大原因。 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(位置)首次定位点。
调试和测试
以下部分介绍用于调试和测试网络时间检测功能的 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