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

铁佛  金牌会员 | 2024-6-20 18:26:12 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 672|帖子 672|积分 2016

一,征象:

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服务器

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

  1. <!-- Remote server that can provide NTP responses. -->
  2. <string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>
  3. <!-- Normal polling frequency in milliseconds -->
  4. <integer name="config_ntpPollingInterval">86400000</integer>  
  5. <!-- Try-again polling interval in milliseconds, in case the network request failed -->
  6. <integer name="config_ntpPollingIntervalShorter">30000</integer>  
  7. <!-- Number of times to try again with the shorter interval, before backing
  8.      off until the normal polling interval. A value < 0 indicates infinite. -->
  9. <integer name="config_ntpRetry">5</integer>   
  10. <!-- Timeout to wait for NTP server response in milliseconds. -->
  11. <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服务器可以自行更换为自己增长列表中的地址,比方:
  1. <string translatable="false" name="config_ntpServer">ntp1.aliyun.com</string>
复制代码
3. 增长NTP列表

添加多个Ntp服务器用于轮询,制止默认Ntp服务器失效;安卓10以后ntp的判定规则有所不同,所以代码有所差异。
1. Android10之前(Android7.1)修改

  1. diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java
  2. index ed2d3c60fcd..60ad5d9f132 100644
  3. --- a/core/java/android/util/NtpTrustedTime.java
  4. +++ b/core/java/android/util/NtpTrustedTime.java
  5. @@ -39,7 +39,7 @@ public class NtpTrustedTime implements TrustedTime {
  6.      private static NtpTrustedTime sSingleton;
  7.      private static Context sContext;
  8. -    private final String mServer;
  9. +    private String mServer;
  10.      private final long mTimeout;
  11.      private ConnectivityManager mCM;
  12. @@ -49,6 +49,15 @@ public class NtpTrustedTime implements TrustedTime {
  13.      private long mCachedNtpElapsedRealtime;
  14.      private long mCachedNtpCertainty;
  15. +    String[] backupNtpServers = new String[]{
  16. +            "tw.pool.ntp.org",
  17. +            "time.nist.gov",
  18. +            "time-a.nist.gov",
  19. +            "ntp1.aliyun.com"
  20. +    };
  21. +    int index = -1;
  22. +
  23. +
  24.      private NtpTrustedTime(String server, long timeout) {
  25.          if (LOGD) Log.d(TAG, "creating NtpTrustedTime using " + server);
  26.          mServer = server;
  27. @@ -101,15 +110,29 @@ public class NtpTrustedTime implements TrustedTime {
  28.          if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");
  29.          final SntpClient client = new SntpClient();
  30. -        if (client.requestTime(mServer, (int) mTimeout)) {
  31. -            mHasCache = true;
  32. -            mCachedNtpTime = client.getNtpTime();
  33. -            mCachedNtpElapsedRealtime = client.getNtpTimeReference();
  34. -            mCachedNtpCertainty = client.getRoundTripTime() / 2;
  35. -            return true;
  36. -        } else {
  37. -            return false;
  38. +
  39. +        boolean result = false;
  40. +               while(!(result = client.requestTime(mServer, (int)mTimeout)) && index < (backupNtpServers.length-1)){
  41. +               index++;
  42. +               mServer = backupNtpServers[index];
  43.          }
  44. +        index = -1;
  45. +               Resources res = sContext.getResources();
  46. +               String defaultServer = res.getString(
  47. +                    com.android.internal.R.string.config_ntpServer);
  48. +               String secureServer = Settings.Global.getString(
  49. +                     sContext.getContentResolver(), Settings.Global.NTP_SERVER);
  50. +
  51. +               mServer  = secureServer != null ? secureServer : defaultServer;
  52. +
  53. +               if(result){
  54. +                       mHasCache = true;
  55. +                       mCachedNtpTime = client.getNtpTime();
  56. +                       mCachedNtpElapsedRealtime = client.getNtpTimeReference();
  57. +                       mCachedNtpCertainty = client.getRoundTripTime() / 2;
  58. +               }
  59. +
  60. +               return result;
  61.      }
  62.      @Override
复制代码
2. Android10之后(Android11.0)修改

  1. diff --git a/frameworks/base/core/java/android/util/NtpTrustedTime.java b/frameworks/base/core/java/android/util/NtpTrustedTime.java
  2. old mode 100644
  3. new mode 100755
  4. index 0892c94d5b..bb8f894cb3
  5. --- a/frameworks/base/core/java/android/util/NtpTrustedTime.java
  6. +++ b/frameworks/base/core/java/android/util/NtpTrustedTime.java
  7. @@ -98,6 +98,27 @@ public class NtpTrustedTime implements TrustedTime {
  8.      private static NtpTrustedTime sSingleton;
  9. +       String[] backupNtpServers = new String[]{
  10. +               "time.nist.gov",
  11. +               "time-a.nist.gov",
  12. +               "ntp1.aliyun.com",
  13. +               "ntp2.aliyun.com",
  14. +               "ntp3.aliyun.com",
  15. +               "ntp-sz.chl.la",
  16. +               "3.cn.pool.ntp.org",
  17. +               "asia.pool.ntp.org",
  18. +               "cn.pool.ntp.org",
  19. +               "sg.pool.ntp.org",
  20. +               "jp.pool.ntp.org",
  21. +               "hk.pool.ntp.org",
  22. +               "s2g.time.edu.cn",
  23. +               "oceania.pool.ntp.org",
  24. +               "south-america.pool.ntp.org",
  25. +               "north-america.pool.ntp.org",
  26. +               "tw.pool.ntp.org",
  27. +       };
  28. +       int index = -1;
  29. +
  30.      @NonNull
  31.      private final Context mContext;
  32. @@ -162,12 +183,18 @@ public class NtpTrustedTime implements TrustedTime {
  33.              if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");
  34.              final SntpClient client = new SntpClient();
  35. -            final String serverName = connectionInfo.getServer();
  36. +            boolean result = false;
  37. +            String serverName = connectionInfo.getServer();
  38. +            if (LOGD) Log.d(TAG, "----------rockemd-add-20221027-serverName--1------"+serverName);
  39.              final int timeoutMillis = connectionInfo.getTimeoutMillis();
  40. -            if (client.requestTime(serverName, timeoutMillis, network)) {
  41. +            while (!(result = client.requestTime(serverName, timeoutMillis, network)) && index < (backupNtpServers.length-1) ) {
  42. +                index++;
  43. +                serverName = backupNtpServers[index];
  44. +                if (LOGD) Log.d(TAG, "----------rockemd-add-20221027-serverName--------"+serverName);
  45. +            }
  46. +            if(result){
  47.                  long ntpCertainty = client.getRoundTripTime() / 2;
  48. -                mTimeResult = new TimeResult(
  49. -                        client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);
  50. +                mTimeResult = new TimeResult(client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);
  51.                  return true;
  52.              } else {
  53.                  return false;
复制代码
三,调试:

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

  1. adb shell settings put global ntp_server ntp.ntsc.ac.cn  //更改服务器地址
  2. adb shell setprop persist.sys.timezone Asia/Shangha  //更改时区
  3. adb shell settings get global ntp_server  //查看当前使用地址
  4. adb shel1 settings put global auto_time 1  //打开网络同步时间开关
  5. adb shel1 settings put global auto_time 0  //关闭网络同步时间开关
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表