Android Ntp系统校时流程
Android Ntp 系统校时相关
一、系统NTP服务启动
系统NewNetworkTimeUpdateService服务由system_server启动时创建并注册到ServiceManager,可通过Binder的network_time_update_service标签获取服务,代码如下:
//frameworks/base/services/java/com/android/server/SystemServer.java
traceBeginAndSlog("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_service
PollingIntervalMs: +1d0h0m0s0ms
PollingIntervalShorterMs: +1m0s0ms
TryAgainTimesMax: 3
TimeErrorThresholdMs: +5s0ms
TryAgainCounter: 0
NTP cache age: 9223372036854775807
NTP cache certainty: 9223372036854775807
msm8953_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之后才会触发,主要有以下几种方式
- Settings数据库auto_time变化触发:如果有打开自动时间开关且距上次请求的时间大于PollingIntervalMs会触发NTP请求
- 网络状态变化:接收到NetworkCallback.onAvailable时且距上次请求的时间大于PollingIntervalMs会触发NTP请求
- AlarmManager定时器触发:如果请求成功后会设置间隔PollingIntervalMs时长的定时器,下次触发后会触发NTP请求
三、其他请求NTP机制
- GNSS请求NTP校时:GnssLocationProvider.java中接收到requestUtcTime回调时会触发
- 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 | 参考时钟标识符(如 GPS 、PPS ) |
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: server
00...... = 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 seconds
Root Dispersion: 0.000061 seconds
Reference ID:Unidentified reference source 'GOOG'
Reference Timestamp: Nov 7, 2024 09:45:41.690062960 UTC
Origin Timestamp: Nov 7, 2024 09:45:40.51099986 UTC
Receive Timestamp: Nov 7, 2024 09:45:41.690062960 UTC
Transmit Timestamp: Nov 7, 2024 09:45:41.690002961 UTC