当前位置: 首页 > news >正文

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之后才会触发,主要有以下几种方式

  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的数据,数据介绍如下:

偏移量字段名长度说明
0x00LI (Leap Indicator)2 bits闰秒标识:0=无闰秒;1=末分钟61秒;2=末分钟59秒;3=时钟未同步‌
0x00VN (Version Number)3 bitsNTP 协议版本
0x00Mode3 bits工作模式:3=客户端;4=服务器;5=广播;6=控制消息‌
0x01Stratum8 bits时间源层级:0=无效;1=主服务器(如原子钟);2~15=次级服务器
0x02Poll8 bits轮询间隔(以秒为单位的指数)‌
0x03Precision8 bits时钟精度(以秒为单位的指数)‌
0x04Root Delay32 bits到主时钟源的往返延迟(单位:毫秒)‌
0x08Root Dispersion32 bits相对于主时钟源的最大误差(单位:毫秒)‌
0x0CReference ID32 bits参考时钟标识符(如 GPSPPS)‌
0x10Reference Timestamp64 bits服务器最后一次同步源时钟的时间‌
0x18Originate Timestamp64 bits客户端发送请求‌的时间
0x20Receive Timestamp64 bits服务器接收请求‌的时间
0x28Transmit Timestamp64 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
http://www.dtcms.com/a/298686.html

相关文章:

  • C#(基本语法)
  • 人工智能冗余:大语言模型为何有时表现不佳(以及我们能做些什么)
  • 推荐系统多目标排序模型以及融合策略
  • WebSocket详解
  • ClickHouse 高性能实时分析数据库-物化视图篇
  • 学习笔记《区块链技术与应用》第二天 共识机制
  • 亚马逊阿联酋推“Amazon Bazaar”:解码中东电商市场的本地化突围
  • 线程安全的单例模式
  • 基于米尔瑞芯微RK3576开发板部署运行TinyMaix:超轻量级推理框架
  • 2025年高防IP全景解读:从流量清洗到智能防御的核心跃迁
  • mib2c --生成标量数据对应c文件
  • NOIP普及组系列【2015】 P2669 [NOIP 2015 普及组] 金币题解
  • GPU 驱动安装升级测试
  • 避开算力坑!无人机桥梁检测场景下YOLO模型选型指南
  • Minio Docker 集群部署
  • 【阅读整理】野火ADC_AD7192模块资料
  • haproxy七层代理(超详细)
  • 算法讲解--查找总价值为目标值的两个商品
  • MyBatisPlus简介与基本CRUD
  • 域名服务器的作用是什么
  • 【js(7)创建对象的三种写法】
  • Node.js(三)之Express
  • Three.js 动画系统入门:Tween.js 与 AnimationMixer 的使用
  • 习题5.6 “数学黑洞“
  • Java研学-RabbitMQ(二)
  • 亚德诺半导体AD8612ARUZ-REEL双通道精密运算放大器,0.5μV超低失调电压+0.02μV/°C温漂!
  • 老龄化浪潮下的破局者:智慧养老重塑银发经济格局
  • ptmalloc(glibc-2.12.1)源码解析2
  • 深入理解 UDP 协议:从原理到实战的技术解析
  • 开源语音TTS与ASR大模型选型指南(2025最新版)(疯聊AI提供)