网络时间检测

Android 设备会自动尝试从网络来源获取正确的 Unix 纪元时间。Android 使用 UDP 协议的 SNTP 协议获取时间信息。

本页面介绍的组件属于自动时间检测系统(称为“网络时间源站”)。当设备支持自动时间检测且 time_detector 服务配置为使用该时间时,网络时间服务器的时间信号可用于设置 Android 设备的系统时钟。

默认情况下,Android 会将网络时间源站作为主要的自动时间检测源站。

网络时间检测系统

在 Android 系统服务器中运行的 network_time_update_service 服务可实现网络时间检测系统。该服务会定期使用 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 未能刷新后,这是系统在退避并使用正常轮询间隔 (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 会假设对称网络延迟,也就是说,请求的网络延迟与响应的网络延迟相同,并且正确的时间正好位于该网络往返的中间。通常,网络往返时间大约为几百毫秒,在有线网络上,延迟时间接近对称,导致用户几乎感觉不到不准确。但是,在移动或无线电话方面,有多个阶段相对而言,非对称延迟会插入网络事务中,从而导致不准确。

在 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 服务获取的时间:

调试和测试

以下部分介绍了用于调试和测试网络时间检测功能的 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