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

相关文章:

  • HTML 常用标签速查表
  • 深入解析 ArkUI 触摸事件机制:从点击到滑动的开发全流程
  • 14-C语言:第14天笔记
  • MyBatis-Plus中使用BaseMapper实现基本CRUD
  • spring boot整合mybatis
  • Haprxy七层代理
  • MyBatisPlus(一)简介与基本CRUD
  • 开疆智能ModbusTCP转Profient网关连接西门子PLC与川崎机器人配置案例
  • leetcode933最近的请求次数
  • 继承接口实现websocke,实现任意路径链接
  • Java 流(Stream)分类、用途与性能分析
  • 黑马点评01 - 项目介绍 短信登录
  • 【C#补全计划:类和对象(七)—— 重写虚方法】
  • 屏幕适配--像素篇
  • C/C++---I/O性能优化
  • Linux的磁盘存储管理实操——(下二)——逻辑卷管理LVM的扩容、缩容
  • 小白如何认识并处理Java异常?
  • gig-gitignore工具实战开发(三):gig add基础实现
  • 双指针算法介绍及使用(下)
  • which soffice soffice not found
  • OpenRLHF:面向超大语言模型的高性能RLHF训练框架
  • 机器学习之knn算法保姆级教学
  • SEC_FirePower 第二天作业
  • Keepalived 原理及配置(高可用)
  • ubuntu22.04.4锁定内核应对海光服务器升级内核无法启动问题
  • 【Docker项目实战】在Docker环境下部署go-file文件分享工具
  • 5G基站信号加速器!AD8021ARZ-REEL7亚德诺 超低噪声高速电压放大器 专利失真消除技术!
  • 从零开发Java坦克大战:架构设计与难点突破 (下)
  • C++ 多线程同步机制详解:互斥锁、条件变量与原子操作
  • 电子电气架构 --- 车载软件与样件产品交付的方法