安卓系统无法自动对时的问题

来源:互联网 发布:淘宝物流信息不更新 编辑:程序博客网 时间:2024/05/16 10:19

大家在使用Android系统的时候,可能会发现,在不插sim卡仅连wifi的情况下使用自动对时,可能很久都无法对时成功。现在给大家讲解下Android系统的自动对时功能。


在分析引发此问题的原因之前,先来了解下网络对时的两个基本概念:

(1)NITZ:

NITZ(Network Identity and Time Zone)或网络标识和时区,是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息。NITZ是自从PHASE 2+ RELEASE 96 的GSM中的可选功能,经常被用来自动更新移动电话的系统时钟。

(2)NTP:

NTP(Network Time Protocol)提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。


Android的自动对时功能就是通过使用NITZ者或NTP和服务器进行时间同步,其中NITZ优先于NTP(插入sim卡

时使用NITZ,没插卡仅连wifi时使用NTP),使用这个功能的前提是网络通讯正常,可以正确无误的收发包。那么问

题来了,触发Android自动对时的条件有哪些呢?

Android自动对时触发条件有三个:

(1)EVENT_AUTO_TIME_CHANGED,点击“自动获取时间”选项时

(2)EVENT_POLL_NETWORK_TIME,轮询定时器周期已到的时候

(3)EVENT_NETWORK_CONNECTED, 网络连接成功的时候

第一个触发条件,单次有效,也就是点击的时候才会触发;

第二个触发条件,开机时开始轮询,最多查询三次,如果第一次自动对时失败,则间隔60s再查询第二次,如果连续

     三次都自动对时失败,则间隔24小时再做下一次查询;

第三个触发条件,网络连接成功,包括wifi连接和sim卡的运营商网络连接,也是单次有效;


由于Android使用UDP协议发送自动对时的数据包,在网络环境不好或者服务器响应不及时的情况下,很可能造

成获取服务器时间数据包失败,因此造成自动对时失败。刚才上面讲到了,第一种和第三种触发条件是单次响应,第

二种触发条件是开机后连续间隔60s轮询三次。开机后连接wifi,触发条件产生时,在系统向NTP服务器连续发送3次

以上UDP数据包失败后,将不会有新的触发条件产生(除非手动操作,但这样做太费时),因此最终导致自动对时失

败。


现在知道为什么Android系统会概率性的网络对时失败了,那么应该如何规避这个问题呢?

经过跟踪代码流程和大量测试发现,只需要修改一个源文件中的两个变量就可以解决此问题。

~/Framework/base/service/java/com/android/server/NetworkTimeServiceUpdate.java

修改POLLING_INTERVAL_SHORTER_MS和TRY_AGAIN_TIMES_MAX

改成如下数值:

POLLING_INTERVAL_SHORTER_MS = 20 * 1000L

TRY_AGAIN_TIMES_MAX = 300


1 0