> 技术文档 > Android Ntp系统校时流程

Android Ntp系统校时流程


Android Ntp 系统校时相关

一、系统NTP服务启动

​系统NewNetworkTimeUpdateService服务由system_server启动时创建并注册到ServiceManager,可通过Binder的network_time_update_service标签获取服务,代码如下:

//frameworks/base/services/java/com/android/server/SystemServer.javatraceBeginAndSlog(\"StartNetworkTimeUpdateService\");try {if (useNewTimeServices) { networkTimeUpdater = new NewNetworkTimeUpdateService(context);}else {networkTimeUpdater = new OldNetworkTimeUpdateService(context);} Slog.d(TAG, \"Using networkTimeUpdater class=\" + networkTimeUpdater.getClass()); ServiceManager.addService(\"network_time_update_service\", networkTimeUpdater);v} catch (Throwable e) {reportWtf(\"starting NetworkTimeUpdate service\", e);}traceBeginAndSlog(\"CertBlacklister\");

可通过dumpsys工具或者当前NTP服务的运行状态:

msm8953_64:/ # dumpsys network_time_update_servicePollingIntervalMs: +1d0h0m0s0msPollingIntervalShorterMs: +1m0s0msTryAgainTimesMax: 3TimeErrorThresholdMs: +5s0msTryAgainCounter: 0NTP cache age: 9223372036854775807NTP cache certainty: 9223372036854775807msm8953_64:/ #

PollingIntervalMs:NTP 请求间隔时间,默认配置在base/core/res/res/values/config.xml中的config_ntpPollingInterval标签,默认值20小时(86400000)

PollingIntervalShorterMs:如果请求失败下次请求间隔时间,默认值base/core/res/res/values/config.xml中的config_ntpPollingIntervalShorter标签默认值60000

TryAgainTimesMax:请求失败重试次数,base/core/res/res/values/config.xml中的config_ntpRetry标签,默认值3

TimeErrorThresholdMs:NTP时间与本地时差超过此范围则设置系统时间,base/core/res/res/values/config.xml中的config_ntpThreshold标签,默认值5S(5000)

TryAgainCounter:请求失败重试次数

NTP cache age:上次请求到的NTP时间时长(当前CPU启动时间-上次保存时CPU启动时间),默认值是Long.MAX_VALUE(即:9223372036854775807)

NTP cache certainty:RTT 表示数据包在网络中完整往返一次的耗时,默认值Long.MAX_VALUE(即:9223372036854775807)

二、NewNetworkTimeUpdateService服务请求NTP触发机制

​设备准备就绪systemRunning之后才会触发,主要有以下几种方式

  1. Settings数据库auto_time变化触发:如果有打开自动时间开关且距上次请求的时间大于PollingIntervalMs会触发NTP请求
  2. 网络状态变化:接收到NetworkCallback.onAvailable时且距上次请求的时间大于PollingIntervalMs会触发NTP请求
  3. AlarmManager定时器触发:如果请求成功后会设置间隔PollingIntervalMs时长的定时器,下次触发后会触发NTP请求

三、其他请求NTP机制

  1. GNSS请求NTP校时:GnssLocationProvider.java中接收到requestUtcTime回调时会触发
  2. SIM卡注网成功后从运营商网络(如 NITZ 协议)获取时间

四、实现介绍

NTP请求通过NtpTrustedTime实现,NtpTrustedTime处理请求逻辑与数据存储,SntpClient负责网络请求。Gnss通过NtpTimeHelper处理相关请求,涉及代码如下:

base/services/core/java/com/android/server/location/GnssLocationProvider.java #Gnss 与HAL交互base/services/core/java/com/android/server/location/NtpTimeHelper.java #Gnss请求base/core/java/android/util/NtpTrustedTime.java #逻辑实现(单例)base/services/core/java/com/android/server/NewNetworkTimeUpdateService.java #服务base/services/java/com/android/server/SystemServer.java #服务启动base/core/res/res/values/config.xml #配置文件base/core/java/android/net/SntpClient.java #网络请求base/core/java/android/util/TrustedTime.java #接口

网络请求到长度为48的数据,数据介绍如下:

偏移量 字段名 长度 说明0x00‌ LI (Leap Indicator) 2 bits 闰秒标识:0=无闰秒;1=末分钟61秒;2=末分钟59秒;3=时钟未同步‌ 0x00 VN (Version Number) 3 bits NTP 协议版本 0x00‌ Mode 3 bits 工作模式:3=客户端;4=服务器;5=广播;6=控制消息‌ 0x01 Stratum 8 bits 时间源层级:0=无效;1=主服务器(如原子钟);2~15=次级服务器 0x02‌ Poll 8 bits 轮询间隔(以秒为单位的指数)‌ 0x03‌ Precision 8 bits 时钟精度(以秒为单位的指数)‌ 0x04‌ Root Delay 32 bits 到主时钟源的往返延迟(单位:毫秒)‌ 0x08‌ Root Dispersion 32 bits 相对于主时钟源的最大误差(单位:毫秒)‌ 0x0C‌ Reference ID 32 bits 参考时钟标识符(如 GPSPPS)‌ 0x10‌ Reference Timestamp 64 bits 服务器最后一次同步源时钟的时间‌ 0x18‌ Originate Timestamp 64 bits 客户端发送请求‌的时间 0x20‌ Receive Timestamp 64 bits 服务器接收请求‌的时间 0x28 Transmit Timestamp 64 bits 服务器发送响应‌的时间

如下,在tcpdump中抓到的数据解析:

Flags: 0xic, Leap Indicator: no warning, Version number: NTPVersion 3, Mode: server00...... = Leap Indicator: no warning (0)..01 1... = Version number: NTP Version 3 (3).....100 = Mode: server (4)[Request In: 43][Delta Time: 0.071281000 seconds]Peer Clock Stratum: primary reference (1)Peer Polling Interval: 0 (1 seconds)Peer Clock Precision: -20 (0.000000000954 seconds)Root Delay: 0.000000 secondsRoot Dispersion: 0.000061 secondsReference ID:Unidentified reference source \'GOOG\'Reference Timestamp: Nov 7, 2024 09:45:41.690062960 UTCOrigin Timestamp: Nov 7, 2024 09:45:40.51099986 UTCReceive Timestamp: Nov 7, 2024 09:45:41.690062960 UTCTransmit Timestamp: Nov 7, 2024 09:45:41.690002961 UTC