Android系统 关于ntp的修改(网络时间同步)

一,现象:

1. NTP介绍

NTP:网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。

Android系统使用NTP自动更新系统时间的触发机制:

监听数据库字段AUTO_TIME,当这个字段发生变化的时候,会立即触发一次时间同步
网络连接发生变化,当网络接通,会触发一次时间检查和同步
定时更新机制,当预定的时间到了,会触发一次时间检查和同步

Android自动同步时间是通过NtpServer来同步时间的,但是默认的服务器使用的是Google的所以无法连接,会导致自动同步日期和时间无效。

2. NTP时间设置流程示意图:

在这里插入图片描述

二,解决方案:

以下修改都在源码frameworks/base/

1. 修改默认的Ntp服务器

diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 129cee58078..8ffc237c7e1 100755
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -229,4 +229,6 @@<integer name="def_screenshot_button_show">1</integer><!-- the store location of screen capture by default--><string name="def_screenshot_location">internal_storage</string>
+
+    <string name="def_ntp_server" translatable="false">time.windows.com</string>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 0ba3a5289ed..29361ad19bc 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2733,6 +2733,9 @@ class DatabaseHelper extends SQLiteOpenHelper {loadSetting(stmt, Settings.Global.ENHANCED_4G_MODE_ENABLED,ImsConfig.FeatureValueConstants.ON);+            loadStringSetting(stmt, Settings.Global.NTP_SERVER,
+                    R.string.def_ntp_server);
+/** IMPORTANT: Do not add any more upgrade steps here as the global,* secure, and system settings are no longer stored in a database

2. 修改NTP基础配置

<!-- Remote server that can provide NTP responses. -->
<string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>
<!-- Normal polling frequency in milliseconds -->
<integer name="config_ntpPollingInterval">86400000</integer>  
<!-- Try-again polling interval in milliseconds, in case the network request failed -->
<integer name="config_ntpPollingIntervalShorter">30000</integer>  
<!-- Number of times to try again with the shorter interval, before backingoff until the normal polling interval. A value < 0 indicates infinite. -->
<integer name="config_ntpRetry">5</integer>   
<!-- Timeout to wait for NTP server response in milliseconds. -->
<integer name="config_ntpTimeout">10</integer> 

2.android.pool.ntp.org:这个是NTP服务器地址
86400000:周期默认8640000ms,即1天,一般不改
30000:是由于网络原因,时间同步失败后,retry的时间间隔,默认是60000ms,即60s这里改成30s
5:retry的次数,默认是3次
10:时间误差,默认是5000ms,当时间误差超过5s,会更新系统时间,改成10ms.

wifi自动确定时间的问题时,NTP服务器可以自行更换为自己增加列表中的地址,例如:

<string translatable="false" name="config_ntpServer">ntp1.aliyun.com</string>

3. 增加NTP列表

添加多个Ntp服务器用于轮询,避免默认Ntp服务器失效;安卓10以后ntp的判定规则有所不同,所以代码有所差异。

1. Android10之前(Android7.1)修改

diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java
index ed2d3c60fcd..60ad5d9f132 100644
--- a/core/java/android/util/NtpTrustedTime.java
+++ b/core/java/android/util/NtpTrustedTime.java
@@ -39,7 +39,7 @@ public class NtpTrustedTime implements TrustedTime {private static NtpTrustedTime sSingleton;private static Context sContext;-    private final String mServer;
+    private String mServer;private final long mTimeout;private ConnectivityManager mCM;
@@ -49,6 +49,15 @@ public class NtpTrustedTime implements TrustedTime {private long mCachedNtpElapsedRealtime;private long mCachedNtpCertainty;+    String[] backupNtpServers = new String[]{
+            "tw.pool.ntp.org",
+            "time.nist.gov",
+            "time-a.nist.gov",
+            "ntp1.aliyun.com"
+    };
+    int index = -1;
+
+private NtpTrustedTime(String server, long timeout) {if (LOGD) Log.d(TAG, "creating NtpTrustedTime using " + server);mServer = server;
@@ -101,15 +110,29 @@ public class NtpTrustedTime implements TrustedTime {if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");final SntpClient client = new SntpClient();
-        if (client.requestTime(mServer, (int) mTimeout)) {
-            mHasCache = true;
-            mCachedNtpTime = client.getNtpTime();
-            mCachedNtpElapsedRealtime = client.getNtpTimeReference();
-            mCachedNtpCertainty = client.getRoundTripTime() / 2;
-            return true;
-        } else {
-            return false;
+
+        boolean result = false;
+               while(!(result = client.requestTime(mServer, (int)mTimeout)) && index < (backupNtpServers.length-1)){
+               index++;
+               mServer = backupNtpServers[index];}
+        index = -1;
+               Resources res = sContext.getResources();
+               String defaultServer = res.getString(
+                    com.android.internal.R.string.config_ntpServer);
+               String secureServer = Settings.Global.getString(
+                     sContext.getContentResolver(), Settings.Global.NTP_SERVER);
+
+               mServer  = secureServer != null ? secureServer : defaultServer;
+
+               if(result){
+                       mHasCache = true;
+                       mCachedNtpTime = client.getNtpTime();
+                       mCachedNtpElapsedRealtime = client.getNtpTimeReference();
+                       mCachedNtpCertainty = client.getRoundTripTime() / 2;
+               }
+
+               return result;}@Override

2. Android10之后(Android11.0)修改

diff --git a/frameworks/base/core/java/android/util/NtpTrustedTime.java b/frameworks/base/core/java/android/util/NtpTrustedTime.java
old mode 100644
new mode 100755
index 0892c94d5b..bb8f894cb3
--- a/frameworks/base/core/java/android/util/NtpTrustedTime.java
+++ b/frameworks/base/core/java/android/util/NtpTrustedTime.java
@@ -98,6 +98,27 @@ public class NtpTrustedTime implements TrustedTime {private static NtpTrustedTime sSingleton;
+       String[] backupNtpServers = new String[]{
+               "time.nist.gov",
+               "time-a.nist.gov",
+               "ntp1.aliyun.com",
+               "ntp2.aliyun.com",
+               "ntp3.aliyun.com",
+               "ntp-sz.chl.la",
+               "3.cn.pool.ntp.org",
+               "asia.pool.ntp.org",
+               "cn.pool.ntp.org",
+               "sg.pool.ntp.org",
+               "jp.pool.ntp.org",
+               "hk.pool.ntp.org",
+               "s2g.time.edu.cn",
+               "oceania.pool.ntp.org",
+               "south-america.pool.ntp.org",
+               "north-america.pool.ntp.org",
+               "tw.pool.ntp.org",
+       };
+       int index = -1;
+@NonNullprivate final Context mContext;
@@ -162,12 +183,18 @@ public class NtpTrustedTime implements TrustedTime {if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");final SntpClient client = new SntpClient();
-            final String serverName = connectionInfo.getServer();
+            boolean result = false;
+            String serverName = connectionInfo.getServer();
+            if (LOGD) Log.d(TAG, "----------rockemd-add-20221027-serverName--1------"+serverName);final int timeoutMillis = connectionInfo.getTimeoutMillis();
-            if (client.requestTime(serverName, timeoutMillis, network)) {
+            while (!(result = client.requestTime(serverName, timeoutMillis, network)) && index < (backupNtpServers.length-1) ) {
+                index++;
+                serverName = backupNtpServers[index];
+                if (LOGD) Log.d(TAG, "----------rockemd-add-20221027-serverName--------"+serverName);
+            }
+            if(result){long ntpCertainty = client.getRoundTripTime() / 2;
-                mTimeResult = new TimeResult(
-                        client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);
+                mTimeResult = new TimeResult(client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);return true;} else {return false;

三,调试:

1. 通过adb更改当前服务器地址

adb shell settings put global ntp_server ntp.ntsc.ac.cn  //更改服务器地址
adb shell setprop persist.sys.timezone Asia/Shangha  //更改时区
adb shell settings get global ntp_server  //查看当前使用地址
adb shel1 settings put global auto_time 1  //打开网络同步时间开关
adb shel1 settings put global auto_time 0  //关闭网络同步时间开关

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

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

相关文章

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

4500万英镑!英国深化发展量子计算背后“内有乾坤”

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;2200字丨15分钟阅读 近期&#xff0c;英国国家量子计算中心&#xff08;NQCC&#xff09;宣布量子计算实验台竞赛的结果&#xff0c;七家量子…

Python 编程中反斜杠 “\” 的作用:作为续行符和转义字符,处理文件路径和正则表达式时需特别注意。

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Python 中的反斜杠 \ 可以被用作续行符&#xff0c;它允许你将一行代码分成多行来书写&#xff0c;以提高代码的可读性。这在处理长字符串、复杂的数学表达式或其他需要多行布局的代码时非常有用。 使…

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…

【PyTorch】基础学习:一文详细介绍 load_state_dict() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 load_state_dict() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#…

【算法与数据结构】堆排序TOP-K问题

文章目录 &#x1f4dd;堆排序&#x1f320; TOP-K问题&#x1f320;造数据&#x1f309;topk找最大 &#x1f6a9;总结 &#x1f4dd;堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆利…

R语言深度学习-6-模型优化与调试

本教程参考《RDeepLearningEssential》 这是本专栏的最后一篇文章&#xff0c;一路走来&#xff0c;大家应该都可以独立的建立一个自己的神经网络进行特征学习和预测了吧&#xff01; 6.1 缺失值处理 在我们使用大量数据进行建模的时候&#xff0c;缺失值对模型表现的影响非常…

定位及解决OOM

一、定义 内存溢出&#xff1a;OutOfMemoryError&#xff0c;是指因内存不够&#xff0c;导致操作新对象没有剩余空间。会导致频繁fullgc出现STW从而导致性能下降。 内存泄漏&#xff1a;指用malloc或new申请了一块内存&#xff0c;但是没有通过free或delete将内存释放&#…

30.HarmonyOS App(JAVA)鸿蒙系统app多线程任务分发器

HarmonyOS App(JAVA)多线程任务分发器 打印时间&#xff0c;记录到编辑框textfield信息显示 同步分发&#xff0c;异步分发&#xff0c;异步延迟分发&#xff0c;分组任务分发&#xff0c;屏蔽任务分发&#xff0c;多次任务分发 参考代码注释 场景介绍 如果应用的业务逻辑比…

LLM之Alpaca:深入了解大模型Alpaca

博客首发地址&#xff1a;LLM之Alpaca&#xff1a;深入了解大模型Alpaca - 知乎 官方链接&#xff1a;https://crfm.stanford.edu/2023/03/13/alpaca.html官方Git&#xff1a;tatsu-lab/stanford_alpaca官方模型&#xff1a;https://huggingface.co/tatsu-lab/alpaca-7b-wdiff…

Android Studio 打包 Maker MV apk 详细步骤

一.使用RPG Make MV 部署项目&#xff0c;获取项目文件夹 这步基本都不会有问题&#xff1a; 二.安装Android Studio 安装过程参考教材就行了&#xff1a; https://blog.csdn.net/m0_62491877/article/details/126832118 但是有的版本面板没有Android的选项&#xff08;勾…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

LM2903BIDR比较器芯片中文资料规格书PDF数据手册参数引脚图功能封装尺寸图

产品概述&#xff1a; M393B 和 LM2903B 器件是业界通用 LM393 和 LM2903 比较器系列的下一代版本。下一代 B 版本比较器具有更低的失调电压、更高的电源电压能力、更低的电源电流、更低的输入偏置电流和更低的传播延迟&#xff0c;并通过专用 ESD 钳位提高了 2kV ESD 性能和输…

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

UnityShader(十六)凹凸映射

前言&#xff1a; 纹理的一种常见应用就是凹凸映射&#xff08;bump mapping&#xff09;。凹凸映射目的就是用一张纹理图来修改模型表面的法线&#xff0c;让模型看起来更加细节&#xff0c;这种方法不会改变模型原本的顶点位置&#xff08;也就是不会修改模型的形状&#xf…

数据结构之顺序存储-顺序表的基本操作c/c++(创建、初始化、赋值、插入、删除、查询、替换、输出)

学习参考博文&#xff1a;http://t.csdnimg.cn/Qi8DD 学习总结&#xff0c;同时更正原博主在顺序表中插入元素的错误。 数据结构顺序表——基本代码实现&#xff08;使用工具&#xff1a;VS2022&#xff09;&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdi…

gitlab cicd问题整理

1、docker设置数据目录&#xff1a; 原数据目录磁盘空间不足&#xff0c;需要更换目录&#xff1a; /etc/docker/daemon.json //写入/etc/docker/daemon.json {"data-root": "/data/docker" } 2、Dockerfile中ADD指令不生效 因为要ADD的文件被.docker…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

Gin 框架中实现路由的几种方式介绍

本文将为您详细讲解 Gin 框架中实现路由的几种方式&#xff0c;并给出相应的简单例子。Gin 是一个高性能的 Web 框架&#xff0c;用于构建后端服务。在 Web 应用程序中&#xff0c;路由是一种将客户端请求映射到特定处理程序的方法。以下是几种常见的路由实现方式&#xff1a; …