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.hqwc.cn/news/537822.html

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

相关文章

input输入框支持明文暗文切换

input输入框支持明文暗文切换 场景与思路实现 场景与思路 我们通常实现密码框的时候会直接使用 input ,设置它的 type 为 password&#xff0c;如果要实现明文和暗文的切换&#xff0c;实际上就是 type“text” 和 type"password"的切换。 实现 样式上我们可以先找…

Igraph入门指南 5

2、graph_from系列&#xff0c;将其他R数据结构转换成图 2-1 邻接矩阵转图&#xff1a;graph_from_adjacency_matrix 可以接受Matrix包创建的稀疏矩阵作为参数 邻接矩阵中行的顺序被保留&#xff0c;并作为图中顶点的顺序。 本函数几个重要的参数&#xff1a; weighted&am…

EPSON X1E000341003100 FA-238A石英晶体谐振器

EPSON X1E000341003100 FA-238A是一款无源晶振&#xff0c;具有特定的频率和尺寸规格。这款晶振的频率为20MHz&#xff0c;尺寸为3.20 x 2.50mm &#xff0c;这使得它非常适合用于小型化设计中。它的温度范围从-40℃到125℃&#xff0c;并且具有20ppm的频率稳定性&#xff0c;这…

软考高级:软件工程单元测试(驱动模块、被测模块、桩模块)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

FX110网:1月美国零售货币资金环比上升2.61%,嘉盛环比上升1.86%

美国商品期货交易委员会&#xff08;CFTC&#xff09;发布的最新月度报告显示&#xff0c;2024年1月零售货币存款与上月相比上升2.61%。 这份报告涵盖在美国运营的注册零售货币对交易商&#xff08;RFED&#xff09;和经纪自营商。包括嘉信理财&#xff08;CHARLES SCHWAB Futu…

重学SpringBoot3-集成FreeMarker

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成FreeMarker 1. 添加 FreeMarker 依赖2. 配置 FreeMarker 属性&#xff08;可选&#xff09;3. 创建 FreeMarker 模板4. 编写控制器5. 运行应用程序F…

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印

【需求】 从通达信软件截屏下来的K线图&#xff0c;在打印前需要反色&#xff0c;打印后需要手动加上当前日期&#xff0c;这些都可以由程序代替手工完成。 以下是期待的效果。 【关键点】 给图片反色用的是梯度法&#xff0c;这个在网络上已有成型代码&#xff1b; 给图片…

【考研学子必看 ★2024考研国家线及调剂策略(3)】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

C++结合opencv—图像2维直方图初次尝试

// 二维直方图 void QuickDemo::two_histogram_demo(Mat &image) {Mat hsv, hs_hist;cvtColor(image, hsv, COLOR_BGR2HSV);int hbins 30, sbins 32;int hisat_bins[] { hbins,sbins };float h_range[] { 0,180 }; //180/306float s_range[] { 0,256 };// 256/328cons…

javaweb篇请求与相应的参数问题

目录 前言 简单传参设置 get请求无法识别 post请求 简单传参问题无法识别的解决问题 注意事项 改法 实体参数 代码展示 今日分享 前言 友友们&#xff0c;大家好&#xff0c;今天来开荒了,今天介绍的是在进行数据请求以及相应的时候&#xff0c;我们不仅仅只是进入一…

LED基础知识分享(三)

大家好&#xff0c;我是砖一。 一&#xff0c;LED的光衰与使用环境温度 什么叫LED光衰 光衰是指LED经过一段时间的点亮后,其光强会比原来的光强要低,而低了的部分就是LED的光衰。 一般LED封装厂家做测试是在实验室的条件下(25℃的常温下),以20MA的直流电连续点亮LED1000小时…

学习SSM的记录(六)-- Spring MVC

目录 Spring MVC 简介和体验 Spring MVC原理简单解析 Spring MVC涉及的组件 Spring MVC 快速体验 Spring MVC 接收数据 访问路径设置 接收参数&#xff08;重点&#xff09; param和json参数比较 param参数接收 路径参数接收 json参数接收 EnableWebMvc注解 接收C…