wifi时间同步问题

先只把超时时间config_ntpTimeout改为5000试下,并加个日志确认mTimeout是由20000变为5000了。

 

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



 

android网络时间同步

分类: android2014-04-02 21:50 2767人阅读 评论(1) 收藏 举报

起因:有时候android盒子起来了,半天都没有获取到时间,便查看了下这部分代码;

相关文件:

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函数里,先后顺序为以下代码所示:

 163        NetworkTimeUpdateService networkTimeUpdater = null;

 

 772            try {
 773                Slog.i(TAG, "NetworkTimeUpdateService");
 774                networkTimeUpdater = new NetworkTimeUpdateService(context);
 775            } catch (Throwable e) {
 776                reportWtf("starting NetworkTimeUpdate service", e);
 777            }

 

 926        final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;

 

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

 

二、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中定义为

 910    <!-- Remote server that can provide NTP responses. -->
 911     <string translatable="false"name="config_ntpServer">2.android.pool.ntp.org</string>
 912     <!-- Timeout to wait for NTP serverresponse. -->
 913     <integername="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 ,以此优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值