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之后才会触发,主要有以下几种方式
- 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的数据,数据介绍如下:
0
=无闰秒;1
=末分钟61秒;2
=末分钟59秒;3
=时钟未同步3
=客户端;4
=服务器;5
=广播;6
=控制消息0
=无效;1
=主服务器(如原子钟);2~15
=次级服务器GPS
、PPS
)如下,在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