软件平台:android6.0

硬件平台:MT6797

最近,发现我们产品中有一定概率的时间是不对的,我感到很诧异,我司的产品怎么可以这莫弱鸡,而且android本身的智能性,区区一个时间怎么可能也不会校准,岂非辱没谷歌高士的名声~~~

其实,时间校准机制android本身早就有了,不过有赖于系统设置项是否开始时区和时间是否自动校准。印象中那两个设置key为auto_time和auto_timezone分别为自动时间和自动时区校准,而我看我们的产品这些都是放开的,那么,到底是啥情况导致时间不去校准呢?

下边跟了系统中关于时间更新的服务,具体代码见frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java

从代码的逻辑可以看到,这个service是在SystemServer中注册启动的,在systemready之后还会有systemrun的回调进行深度初始化,在这一步中,我们发现注册了网络事件的监听广播。registerForConnectivityIntents,一切看来都很符合逻辑,有网络事件的监测,这样即便开始系统没有网络,无法校准时间,但是在网络通了之后,时间总会实时校准吧?对于我们的板子,这是很奢侈的想法,实际是,网络通了之后并没有同时触发访问时间服务器去更新时间,而是等了上次校准失败后的24小时。

我说一下时间校准的基本逻辑:

通常情况,网络如果ok的情况下,在上述service一加载,就会触发时间同步方法,这个方法会尝试访问我们自己定义的时间服务器列表:

private static final String[] SERVERLIST =  new String[]{
                                             "hshh.org",
                                              "2.android.pool.ntp.org",
                                              "time-a.nist.gov"
                                              };

这个列表在service文件中声明,当然也可以自己添加,系统校准时间的时候会从第一个开始访问,如果能从服务器获取时间则停止访问下一个,而是设置一个config_ntpPollingInterval,这个设置项的定义一般是86400000秒,也就是24小时,说明正常情况下,时间校准24小时一次,防止偏差,而如果第一个服务器访问失败,那么等60s,继续第二个服务器的访问,以此类推,直到最后一个访问完,也没拿到正确时间,就会强制用ntpserver去设置时间,前提是网络通,而如果网络不通,还是会失败的。

我们的设备遇到的情况是时间校准阶段网络不通,上述的流程均未成功获取系统时间,但是网络通了之后,没有触发访问,原来是注册的intentfilter的问题,系统注册的部分如下:

intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
       mContext.registerReceiver(mConnectivityReceiver, intentFilter);
问题出在这里,网络事件发生之后,并没有收到CONNECTIVITY_ACTION 相关广播,而是ACTION_NETWORK_STATS_UPDATED。

具体改动如下:

diff --git a/frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java b/frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java
index 13f7569..1598ad0 100644
--- a/frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java
+++ b/frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java
@@ -77,6 +77,9 @@ public class NetworkTimeUpdateService {
     ///M: deubg logging
     private static final boolean DBG = true;
 
+    private static final String ACTION_NETWORK_STATS_UPDATED =
+            "com.android.server.action.NETWORK_STATS_UPDATED";
+
     private static final int EVENT_AUTO_TIME_CHANGED = 1;
     private static final int EVENT_POLL_NETWORK_TIME = 2;
     private static final int EVENT_NETWORK_CHANGED = 3;
@@ -237,6 +240,7 @@ public class NetworkTimeUpdateService {
     private void registerForConnectivityIntents() {
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+        intentFilter.addAction(ACTION_NETWORK_STATS_UPDATED);
         mContext.registerReceiver(mConnectivityReceiver, intentFilter);
     }
 
@@ -360,7 +364,7 @@ public class NetworkTimeUpdateService {
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
-            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
+            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action) || ACTION_NETWORK_STATS_UPDATED.equals(action)) {
                 // Don't bother checking if we have connectivity, NtpTrustedTime does that for us.
                 mHandler.obtainMessage(EVENT_NETWORK_CHANGED).sendToTarget();
             }

亲测,网络连通的同时,开始了新一波的时间校准操作,时间同步完成~~~~

至此,问题解决。。。

明晚,世界杯1/8对阵:阿根廷对阵法国,希望梅西能顶住,阿根廷顶住,顺利晋级下一轮!!!

android6.0 系统时间不自动校准的问题相关推荐

  1. Android6.0 ios,意超越iOS9!谷歌寄希望于Android6.0系统

    虽然在目前全球的移动操作系统上,谷歌的Android系统市场占有率傲视群雄,但在某些方面iOS系统还是更占优势.对此分析师Dan Gallagher认为谷歌和苹果.Android和iOS之间的战况将随 ...

  2. 零死角玩转Android6.0系统Healthd深入分析

    零死角玩转Android6.0系统Healthd深入分析 概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework ...

  3. android+桌面歌词,Android6.0系统适配桌面歌词效果

    在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的A ...

  4. iTOP-i.MX6Q开发板支持安卓Android6.0系统

    迅为IMX6开发板: Android4.4/6.0系统  Linux + Qt5.7系统  Ubuntu12.04系统 部分案例:HMI:3D打印机:医疗设备:工控机:触控一体机:车载终端 核心板兼容 ...

  5. android6.0 悬浮窗权限,Android6.0系统悬浮窗权限的问题解决方法

    转自:http://blog.csdn.net/tangmanong/article/details/53114758 Android的窗口体系中,WindowManager占有非常重要的地位,平时我 ...

  6. (原创)android6.0系统 PowerManager深入分析

    概述 一直以来,电源管理是电子产品设计中非常重要的环节,也是任何电子设备中最为重要的系统模块之一,优秀的电源管理方案,能够提供持久的续航能力,良好的用户体验,更能提升电子产品的竞争力. 移动设备的电量 ...

  7. (原创)android6.0系统 PowerManager深入分析(很具体)

    概述 一直以来,电源管理是电子产品设计中很重要的环节.也是不论什么电子设备中最为重要的系统模块之中的一个,优秀的电源管理方案.可以提供持久的续航能力,良好的用户体验.更能提升电子产品的竞争力. 移动设 ...

  8. [RK3288][Android6.0] 系统按键驱动流程分析【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406 Rockchip的按键驱动位于 kernel/drivers/input/ke ...

  9. RK3229平台Android6.0系统的一些定制性需求开发

    1.默认语音.地区.时区 device/rockchip/rk322x/rk322x_box/system.prop persist.sys.language=zh #简体中文 persist.sys ...

最新文章

  1. 空间统计笔记之一(基础知识)
  2. 简述数据字典的结构及其作用_数据结构——树基本概念及其遍历
  3. Equipment download和自动生成的IBASE DB 信息
  4. 防范攻击 加强管控 - 数据库安全的16条军规
  5. linux下svn常用命令集锦
  6. imageJ 如何下载plugin_如何给微服务架构的项目做验收测试?
  7. Python urllib2 设置超时时间并处理超时异常
  8. 重置Winsock2
  9. CleanMyMac X2022纯净版苹果电脑管家
  10. C语言单循环比赛固定轮转法,高手请进,请教一道简单的c语言题!
  11. PL(Planet)卫星群遥感数据介绍及应用
  12. python中sub的用法_Python Pandas Series.sub()用法及代码示例
  13. Android设置系统时间和时区
  14. 【jzoj4826】【小澳的葫芦】【二分答案】
  15. 程序员如何摆脱天天CRUD这种打杂状态?
  16. 强基计划 数学相关书籍 推荐
  17. 关于STM32F4xx的GPIO
  18. qt add qrc - Files are not automatically added to the CMakeLists.txt
  19. excel中通过下拉菜单显示不同的报表内容,类似下拉选项中,一旦切换内容,后面的表格内容全都不同?
  20. 后端工程师之路(4)GIT工具的使用与介绍

热门文章

  1. Word 文档保护及解除
  2. Nessus详细使用教程
  3. 使用按键精灵玩棒球忍者
  4. 零基础EVE环境搭建: ②EVE基础部署
  5. thinkphp5.1、thinkphp6
  6. VR工地安全教育三维仿真软件提高作业人员生命财产安全
  7. 支付宝支付,支付宝手机网页支付
  8. Zabbix与ELK整合实现对安全日志数据的实时监控告警
  9. 【java基础】-谈谈对面向对象理解
  10. 捷配PCB优品上线,到底有什么与众不同?