当前位置: 首页 > 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.lryc.cn/news/600049.html

相关文章:

  • 互联网金融项目实战(大数据Hadoop hive)
  • Redis替代方案:腾讯云TDSQL-C内存优化实战,TPS秒上涨
  • App拉起:唤醒即达,告别繁琐操作
  • 百度快排技术分析的核心要素
  • 测试实时性内核参数配置
  • 【初识数据结构】CS61B中的快速排序
  • 洛谷 P11965 [GESP202503 七级] 等价消除-普及/提高-
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——5. 集成OpenCV:让程序拥有“视力”
  • WebGL入门:高斯模糊
  • Qt 网络编程进阶:HTTP 客户端实现
  • leetcode102:二叉树的层序遍历(队列实现)
  • 搜索--二分查找
  • haproxy七层代理(实验)
  • Excel导入数据库-01.构思
  • 4麦 360度定位
  • 力扣 hot100 Day55
  • lock 和 synchronized 区别
  • 基于粒子群优化的PID控制在药液流量控制系统中的应用
  • nacos的配置中心
  • 学习嵌入式的第二十九天-数据结构-(2025.7.16)线程控制:互斥与同步
  • php语法--foreach和in_array的使用
  • 环境变量-进程概念(7)
  • PowerDesigner安装教程(附加安装包)PowerDesigner详细安装教程PowerDesigner 16.6 最新版安装教程
  • 7.文件操作:让程序读写文件 [特殊字符]
  • haproxy七层代理(原理)
  • 【07】C#入门到精通——C# 生成dll库 C#添加现有DLL C#调用自己生成的dll库
  • Typecho多语言解决方案:从插件到主题的完整实现
  • CANoe入门(11)-- 诊断模块
  • SpringBoot学习路径--SpringBoot的简单介绍和项目搭建
  • c++注意点(13)----设计模式(抽象工厂)