[转]android NTP时间同步

Android  2018年11月16日 pm7:19发布6年前 (2018)更新 城堡大人
90 0 0


推荐使用 极客导航极客导航(http://www.biumall.com/jike.html)

相关文件:

frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/java/com/android/server/NetworkTimeUpdateService.java
frameworks/base/core/java/android/util/NtpTrustedTime.java
frameworks/base/core/java/android/net/SntpClient.java
frameworks/base/core/res/res/values/config.xml

一、frameworks/base/services/java/com/android/server/SystemServer.java

里边的ServerThread.run函数中会启用NetworkTimeUpdateService,在这个run函数里,先后顺序为以下代码所示:

 NetworkTimeUpdateService networkTimeUpdater = null;
try {
     Slog.i(TAG, "NetworkTimeUpdateService");
      networkTimeUpdater = new NetworkTimeUpdateService(context);
     } catch (Throwable e) {
        reportWtf("starting NetworkTimeUpdate service", e);
    }
final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;

try {
       if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady();
      } catch (Throwable e) {
         reportWtf("making Network Time Service ready", e);
     }

二、frameworks/base/services/java/com/android/server/NetworkTimeUpdateService.java

用一个handler处理接收三种消息来触发网络时间同步

EVENT_AUTO_TIME_CHANGED
EVENT_POLL_NETWORK_TIME
EVENT_NETWORK_CONNECTED

然后调用onPollNetworkTime去判断是否要同步网络时间,层层判断以后,会调用mTime.forceRefresh();来同步网络时间,将时间保存了mTime中,然后再调用

SystemClock.setCurrentTimeMillis(ntp);来设置系统时间,long ntp = mTime.currentTimeMillis();

其中mTime = NtpTrustedTime.getInstance(context);

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

forceRefresh函数里会调用SntpClient.requestTime(mServer, (int) mTimeout)来获取时间

mServer为同步时间服务器, mTimeout为请求超时时间,在frameworks/base/core/res/res/values/config.xml中定义为

  <!-- Remote server that can provide NTP responses. -->
  <string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>
  <!-- Timeout to wait for NTP server response. -->
  <integer name="config_ntpTimeout">20000</integer>

四、frameworks/base/core/java/android/net/SntpClient.java

跟进这个SntpClient.requestTime()函数中就能看到其使用udp协议去请求网络时间

那么到底这个网络时间同步有多不靠谱呢?

将SntpClient.java拷一份出来到Eclipse上的demo工程里,在应用里用了一下,发现真的很不稳定,如果能连接到,几乎是立马能收到回应,否则就是把超时时间调得再长也没用。

只能在frameworks/base/services/java/com/android/server/NetworkTimeUpdateService.java文件中,将同步时间间隔POLLING_INTERVAL_SHORTER_MS从一分钟改成30秒,并且将最大尝试次数TRY_AGAIN_TIMES_MAX由3改成300,以此优化

 

摘抄于 《android NTP时间同步

 历史上的今天

  1. 2024: Android dab SElinux权限配置(0条评论)
  2. 2023: startActivity源码分析1(0条评论)
  3. 2021: ijkplayer 初始化参数 IJKFFOptions(0条评论)
  4. 2019: 三毛:胆小鬼(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

胡适:人生问题

1903年,我只有十二岁,那年12月17日,有美国的莱特弟兄作第一次飞机试验,用很简单的机器试验成功,因此美国定12月17日为飞行节。12月17日正是我的生日,我觉得我同飞行有前世因缘。我在前十多年,曾在广西飞行过十二天,那时我作了一首《飞行小赞》,这算是关于飞行的很早的一首辞。诸位飞过大西洋、太...

丰子恺:湖畔夜饮

前天晚上,四位来西湖游春的朋友,在我的湖畔小屋里饮酒。酒阑人散,皓月当空。湖水如镜,花影满堤。我送客出门,舍不得这湖上的春月,也向湖畔散步去了。柳荫下一条石凳,空着等我去坐,我就坐了,想起小时在学校里唱的春月歌:“春夜有明月,都作欢喜相。每当灯火中,团团清辉上。人月交相庆,花月并生光。有酒不得饮,举...

木心 :至少,每天要看书

不要讲文学是崇高伟大的。文学可爱。大家课后不要放弃文学。文学是人学。至少,每天要看书,开始读书,要浅,浅到刚开始就可以居高临下。一上来听勃拉姆斯第一交响乐,你会淹死。一开始听《圣母颂》、《军队进行曲》,很好。我小时候听这些,后来到杭州听贝多芬的《月光奏鸣曲》,居然完全不懂,对西方,一开始从基督教...

Android中UID简介

前言记录一下Android 中UID的相关知识。记录一下,方便自己后续查阅。正文什么是UIDUID就是User ID。Android权限基于Linux,UID也是继承于Linux。每个程序都有一个UID,默认情况下,程序A和程序B的UID是不同的。当然,通过配置sharedUserI...

隐藏Settings菜单的几种方法

此文章是摘抄的,作为影藏系统设置中的部分选项还是有效的。本文修改基于mtk6.0系统隐藏一个一级菜单源码位置 packages/apps/Settings/src/com/android/settings/SettingsActivity.java; private int[] S...

Kotlin中的特殊函数简介

前言简单记录一下Kotlin中的run()、apply()、let()、also()和with()等特殊的函数,方便自己查阅。正文run()@kotlin.internal.InlineOnlypublic inline fun <T, R> T.run(block: T....