Android 设置/修改系统NTP服务地址

在这里插入图片描述

Android 手机的 NTP 时间同步(网络时间同步)主要依赖网络,但系统时间来源还包括其他方式,整体时间校准机制是多种来源的结合。具体可分为以下几类:

1. 网络 NTP 同步(最主要方式)

这是 Android 设备获取时间的核心方式,通过访问 NTP 服务器实现:

  • 原理:设备连接 Wi-Fi 或移动数据(蜂窝网络)时,会定期向预设的 NTP 服务器(如 time.android.com、厂商自定义服务器等)发送请求,获取标准时间并校准本地时间。
  • 特点:依赖网络连接,精度通常在毫秒到秒级,是日常使用中最主要的时间来源。

2. GPS/位置服务(辅助时间来源)

GPS 不仅提供位置信息,也会同步时间:

  • 原理:GPS 卫星内置高精度原子钟,设备接收 GPS 信号时,会同时获取卫星的精确时间(UTC 时间),并结合时区信息转换为本地时间。
  • 特点
    • 精度极高(毫秒级),不受网络限制,户外定位时自动同步。
    • 通常作为网络同步的补充,尤其在网络不稳定或无网络时提供时间参考。
    • 部分设备在开启“位置服务”后,会优先使用 GPS 时间校准系统时间。

3. 移动网络(蜂窝网络)时间

部分运营商的移动网络(如 4G/5G)会通过信令传递时间信息:

  • 原理:设备接入蜂窝网络时,可能从基站获取时间(类似 NTP 的简化机制),尤其在早期 2G/3G 网络中更常见。
  • 特点:精度较低(通常秒级),依赖运营商网络配置,现代设备更多以 NTP 同步为主。

4. 本地保存的时间(离线临时使用)

设备断电或重启时,会依赖内置的 RTC(实时时钟)芯片维持基本时间:

  • 原理:RTC 芯片由设备内置电池供电,即使主电源关闭也能运行,保存最近同步的时间。
  • 特点:精度低(可能每天偏差几秒到几分钟),仅作为离线时的临时时间来源,联网后会立即通过 NTP 或 GPS 校准。

总的来说, Android 手机的时间来源是多方式协同的:

  • 主要来源:网络 NTP 同步(最常用,依赖网络)。
  • 辅助来源:GPS 时间(高精度,依赖定位信号)、蜂窝网络时间(运营商提供)。
  • fallback 机制:本地 RTC 时钟(离线时临时使用)。

系统会根据网络状态、定位信号强度等自动选择最优时间来源,确保时间准确性。例如:联网时优先用 NTP,户外定位时结合 GPS 校准,离线时依赖 RTC 并在联网后修正偏差。


NTP 服务:

frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java

    public NetworkTimeUpdateService(Context context) {mContext = context;mTime = NtpTrustedTime.getInstance(context);mAlarmManager = mContext.getSystemService(AlarmManager.class);mTimeDetector = mContext.getSystemService(TimeDetector.class);mCM = mContext.getSystemService(ConnectivityManager.class);Intent pollIntent = new Intent(ACTION_POLL, null);// Broadcast alarms sent by system are immutablemPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent,PendingIntent.FLAG_IMMUTABLE);mPollingIntervalMs = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpPollingInterval);mPollingIntervalShorterMs = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpPollingIntervalShorter);mTryAgainTimesMax = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpRetry);mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);}private void onPollNetworkTimeUnderWakeLock(int event) {long currentElapsedRealtimeMillis = SystemClock.elapsedRealtime();// Force an NTP fix when outdatedNtpTrustedTime.TimeResult cachedNtpResult = mTime.getCachedTimeResult();if (cachedNtpResult == null || cachedNtpResult.getAgeMillis(currentElapsedRealtimeMillis)>= mPollingIntervalMs) {if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");boolean isSuccessful = mTime.forceRefresh();if (isSuccessful) {mTryAgainCounter = 0;} else {String logMsg = "forceRefresh() returned false: cachedNtpResult=" + cachedNtpResult+ ", currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis;if (DBG) {Log.d(TAG, logMsg);}mLocalLog.log(logMsg);}cachedNtpResult = mTime.getCachedTimeResult();}//....}

frameworks/base/core/java/android/util/NtpTrustedTime.java

    @GuardedBy("this")private NtpConnectionInfo getNtpConnectionInfo() {final ContentResolver resolver = mContext.getContentResolver();final Resources res = mContext.getResources();final String hostname;if (mHostnameForTests != null) {hostname = mHostnameForTests;} else {String serverGlobalSetting =Settings.Global.getString(resolver, Settings.Global.NTP_SERVER);if (serverGlobalSetting != null) {hostname = serverGlobalSetting;} else {hostname = res.getString(com.android.internal.R.string.config_ntpServer);}}final Integer port;if (mPortForTests != null) {port = mPortForTests;} else {port = SntpClient.STANDARD_NTP_PORT;}final int timeoutMillis;if (mTimeoutForTests != null) {timeoutMillis = (int) mTimeoutForTests.toMillis();} else {int defaultTimeoutMillis =res.getInteger(com.android.internal.R.integer.config_ntpTimeout);timeoutMillis = Settings.Global.getInt(resolver, Settings.Global.NTP_TIMEOUT, defaultTimeoutMillis);}return TextUtils.isEmpty(hostname) ? null :new NtpConnectionInfo(hostname, port, timeoutMillis);}@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)public boolean forceRefresh() {synchronized (this) {NtpConnectionInfo connectionInfo = getNtpConnectionInfo();if (connectionInfo == null) {// missing server config, so no NTP time availableif (LOGD) Log.d(TAG, "forceRefresh: invalid server config");return false;}ConnectivityManager connectivityManager = mConnectivityManagerSupplier.get();if (connectivityManager == null) {if (LOGD) Log.d(TAG, "forceRefresh: no ConnectivityManager");return false;}final Network network = connectivityManager.getActiveNetwork();final NetworkInfo ni = connectivityManager.getNetworkInfo(network);// This connectivity check is to avoid performing a DNS lookup for the time server on a// unconnected network. There are races to obtain time in Android when connectivity// changes, which means that forceRefresh() can be called by various components before// the network is actually available. This led in the past to DNS lookup failures being// cached (~2 seconds) thereby preventing the device successfully making an NTP request// when connectivity had actually been established.// A side effect of check is that tests that run a fake NTP server on the device itself// will only be able to use it if the active network is connected, even though loopback// addresses are actually reachable.if (ni == null || !ni.isConnected()) {if (LOGD) Log.d(TAG, "forceRefresh: no connectivity");return false;}if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");final SntpClient client = new SntpClient();final String serverName = connectionInfo.getServer();final int port = connectionInfo.getPort();final int timeoutMillis = connectionInfo.getTimeoutMillis();if (client.requestTime(serverName, port, timeoutMillis, network)) {long ntpCertainty = client.getRoundTripTime() / 2;mTimeResult = new TimeResult(client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);return true;} else {return false;}}}

系统默认采用android的NTP服务器:

frameworks/base/core/res/res/values/config.xml

<string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>

frameworks/base/core/java/android/provider/Settings.java

       /** Preferred NTP server. {@hide} */public static final String NTP_SERVER = "ntp_server";

通常, 系统没有提供可视界面供用户设置NTP服务器的接口. 可以通过adb命令来设置:

# 设置NTP服务器
adb shell settings put global "ntp_server" "ntp.aliyun.com"# 关闭 和 打开 自动时间同步
adb shell settings put global "auto_time" 0
adb shell settings put global "auto_time" 1

实际测试发现, AOSP中默认的NTP服务器地址, 经常是访问不上的, 所以, 可以考虑更换为aliyun的ntp服务器;
测试过程:

  1. 关闭自动设置时间(auto_time)
  2. 更改当前系统时间为任意非准确时间
  3. 关闭网络/有SIM卡可以拔出来
  4. 重启系统, 清除NTP缓存数据, 否则, 系统会从缓存的NTP数据来更新当前系统时间
  5. 启动后时间是错误的, 打开WIFI, 打开自动设置时间, 正常情况下系统时间成功更新

适用性

  1. 国内的手机厂商大部分采用的是自定义的NTP服务端
  2. 某些厂商的设备(比如Oculus Quest 系列)在国内水土不服, 建议修改为国内的服务器
  3. 某些特定的行业需要自主的NTP服务器.

参考

网络时间检测
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04 安装vitis2023.2 卡在“Generating installed device list“.

关于这个问题&#xff0c;xilinx有官方说明&#xff0c;链接 原因&#xff1a;问题是 Ubuntu 20.04 缺少 libtinfo.so.5 库。 解决办法&#xff1a; sudo apt-get install libtinfo5

前端全栈修炼手册:从 Vue3 到工程化的进阶之路

本文将全方位覆盖前端开发的核心知识&#xff0c;从 Vue3 框架的基础语法到复杂的工程化实践&#xff0c;从包管理工具的使用到模块规范的深入理解&#xff0c;带你踏上从入门到精通的进阶之路。 Vue3 框架&#xff1a;新时代前端开发的基石 Vue3 核心语法探秘 Vue3 作为目前…

Jetpack Compose 常用控件

Jetpack Compose 常用控件一、基础展示控件&#xff1a;呈现静态内容二、交互控件&#xff1a;响应用户操作三、列表与网格控件&#xff1a;展示大量数据四、导航与标签控件&#xff1a;组织页面结构五、反馈控件&#xff1a;提示与加载状态六、布局控件&#xff1a;组织 UI 结…

Android适配最新SplashScreen方案:让启动页不再“翻车“

Android适配最新SplashScreen方案:让启动页不再"翻车" 各位开发者大佬们,最近是不是又被Android的SplashScreen适配搞得焦头烂额?别慌,今天咱们就来聊聊这个让人又爱又恨的启动页适配方案,保证让你笑出腹肌的同时,还能把技术要点牢牢掌握![6][7][9][10] 一、…

【自动驾驶】《Sparse4Dv3》代码学习笔记

这里时间比较有限&#xff0c;优先看Sparse4Dv3方法里面相对以前改动的地方。 0.参考 代码v1/v2/v3:https://github.com/HorizonRobotics/Sparse4D 跑起来&#xff1a;https://github.com/HorizonRobotics/Sparse4D/blob/v3.0/docs/quick_start.md 1.方法 &#xff08;1&a…

「ECG信号处理——(22)Pan-Tompkins Findpeak 阈值检测 差分阈值算法——三种R波检测算法对比分析」2025年8月8日

目录 1、引言 2、算法原理 &#xff08;1&#xff09;Pan-Tompkins 算法&#xff08;方法1&#xff09; &#xff08;2&#xff09;Findpeak 阈值检测算法&#xff08;方法2&#xff09; &#xff08;3&#xff09;差分阈值算法&#xff08;方法3&#xff09; 3、算法性能…

Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)

在向量搜索中&#xff0c;过滤&#xff08;Filtering&#xff09; 是保证结果精准性和业务契合度的关键手段。Qdrant 的过滤机制不仅能在向量相似度检索的基础上叠加结构化条件&#xff0c;还提供了灵活的布尔逻辑组合&#xff0c;让我们可以像写数据库查询一样&#xff0c;精准…

五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。

1.前情描述 前面的文章我们介绍了RuoYi-Cloud-Plus的nocos的配置内容&#xff0c;已经启动其他服务要注意什么东西。 专栏内容在这&#xff0c;感兴趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.前端项目部署。 官网地址&#xff1a;plus…

工作量评估

工作量评估 API 工作量评估&#xff1a; 得分 入参个数 * 0.2 业务规则 * 0.5 改动的库表个数 * 0.3 得分&#xff08;1-2&#xff09;&#xff1a;简单API-5人天 得分&#xff08;3-8&#xff09;&#xff1a;中等API-8人天 得分&#xff08;8-15&#xff09;&#xff1a;复…

篮球运动(动态规划)

题目描述小明建造了一个篮球场&#xff0c;他请来了2行n列的人&#xff0c;想让他们进行比赛。每一个人都有一个能力值&#xff0c;第一行分别为h11&#xff0c;h12&#xff0c;…&#xff0c;h1n&#xff0c;第二行为h21&#xff0c;h22&#xff0c;…&#xff0c;h2n。现在小…

区块链与大数据分析技术深度解析

目录 区块链与大数据分析技术深度解析 1. 引言:当区块链遇见大数据 2. 区块链数据特性 2.1 数据结构差异 2.2 区块链数据层级 3. 数据获取技术 3.1 节点直连方案 3.2 链上数据湖架构 4. 数据分析关键技术 4.1 交易图谱分析 4.2 地址聚类算法 5. 链上分析应用场景 5.1 反洗钱(A…

网络基础——网络层级

OSI七层模型OSI七层模型名称功能协议应用层直接为用户应用程序&#xff08;如浏览器、邮件客户端&#xff09;提供网络服务接口。HTTP/HTTPS&#xff08;网页浏览&#xff09;FTP&#xff08;文件传输&#xff09;SMTP/POP3&#xff08;邮件&#xff09;DNS&#xff08;域名解析…

【Redis】hash哈希,List列表

目录 一. hash哈希 1.1.常用命令 1.1.1.HSET 1.1.2.HGET 1.1.3.HEXISTS 1.1.4.HDEL 1.1.5.HKEYS 1.1.6.HVALS 1.1.7.HGETALL 1.1.8.HMGET 1.1.9.HLEN 1.1.10.HSETNX 1.1.11.HINCRBY 1.1.12.HINCRBYFLOAT 1.2. 内部编码 1.3. 使用场景 1.4…

MySQL相关概念和易错知识点(4)(分组查询、连接查询、合并查询、子查询)

目录1.分组查询&#xff08;1&#xff09;聚合函数&#xff08;2&#xff09;group by子句&#xff08;3&#xff09;having2.连接查询&#xff08;1&#xff09;内连接&#xff08;笛卡尔积&#xff09;&#xff08;2&#xff09;外连接&#xff08;3&#xff09;内外连接的区…

【Python 高频 API 速学 ①】

一、为什么先学它们&#xff1f; 在真实代码里&#xff0c;90 % 的 bug 都源于「拿到的是 A 类型&#xff0c;却当成 B 类型用」。 把「不确定」变成「确定」——这就是类型转换三兄弟的核心价值。二、三兄弟速览函数一句话定位常见输入失败会怎样int(x)把 x 变成整数‘42’, 3…

FFmpeg 视频旋转信息处理:3.4 vs 7.0.2

1. 概述 FFmpeg 在处理视频旋转信息方面经历了重要的架构变化。本文档详细对比了 FFmpeg 3.4 和 7.0.2 在封装&#xff08;muxing&#xff09;和解封装&#xff08;demuxing&#xff09;视频旋转信息时的差异&#xff0c;并提供兼容性解决方案。文档内容由Claude Sonnet 4辅助撰…

《Resolving tissue complexity by multimodal spatial omics modeling with MISO》

概念多模态空间组学&#xff1a;简单来说&#xff0c;就是同时研究生物组织里的多种分子信息&#xff08;比如基因表达、蛋白质、代谢物、表观遗传标记等&#xff09;&#xff0c;而且这些信息还带有空间位置。MISO&#xff08;MultI-modal Spatial Omics&#xff09;是这篇论文…

三阶段提交(3PC)协议的全面解析:理论、机制与实践局限性

第一部分&#xff1a;非阻塞提交的起源&#xff1a;从两阶段提交&#xff08;2PC&#xff09;的缺陷到三阶段提交&#xff08;3PC&#xff09;的构想在分布式计算领域&#xff0c;确保跨多个独立节点执行的事务的完整性是一项至关重要的挑战。这些节点或站点可能在地理上分散&a…

衰减器的计算

pi型衰减器&#xff0c;如下图所示。 它适用于输入输出阻抗匹配的情况下&#xff0c;还能进行衰减。 不过当输入输出阻抗不匹配时&#xff0c;2个R1也会不相等。 已知特性阻抗Z0&#xff0c;衰减比AVin/Vout&#xff0c;怎么计算R1、R2&#xff1f; 1、电阻分压。 Vout Vi…

Day02 员工管理,分类管理

新增员工需求分析和设计产品原型&#xff1a;接口设计&#xff1a;本项目约定&#xff1a;管理端发出的请求&#xff0c;统一使用 /admin 作为前缀用户端发出的请求&#xff0c;统一使用 /user 作为前缀数据库表设计&#xff1a;代码开发根据新增员工接口设计对应的 DTO&#x…