android6.0 系统时间不自动校准的问题
软件平台: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 系统时间不自动校准的问题相关推荐
- Android6.0 ios,意超越iOS9!谷歌寄希望于Android6.0系统
虽然在目前全球的移动操作系统上,谷歌的Android系统市场占有率傲视群雄,但在某些方面iOS系统还是更占优势.对此分析师Dan Gallagher认为谷歌和苹果.Android和iOS之间的战况将随 ...
- 零死角玩转Android6.0系统Healthd深入分析
零死角玩转Android6.0系统Healthd深入分析 概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework ...
- android+桌面歌词,Android6.0系统适配桌面歌词效果
在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的A ...
- iTOP-i.MX6Q开发板支持安卓Android6.0系统
迅为IMX6开发板: Android4.4/6.0系统 Linux + Qt5.7系统 Ubuntu12.04系统 部分案例:HMI:3D打印机:医疗设备:工控机:触控一体机:车载终端 核心板兼容 ...
- android6.0 悬浮窗权限,Android6.0系统悬浮窗权限的问题解决方法
转自:http://blog.csdn.net/tangmanong/article/details/53114758 Android的窗口体系中,WindowManager占有非常重要的地位,平时我 ...
- (原创)android6.0系统 PowerManager深入分析
概述 一直以来,电源管理是电子产品设计中非常重要的环节,也是任何电子设备中最为重要的系统模块之一,优秀的电源管理方案,能够提供持久的续航能力,良好的用户体验,更能提升电子产品的竞争力. 移动设备的电量 ...
- (原创)android6.0系统 PowerManager深入分析(很具体)
概述 一直以来,电源管理是电子产品设计中很重要的环节.也是不论什么电子设备中最为重要的系统模块之中的一个,优秀的电源管理方案.可以提供持久的续航能力,良好的用户体验.更能提升电子产品的竞争力. 移动设 ...
- [RK3288][Android6.0] 系统按键驱动流程分析【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406 Rockchip的按键驱动位于 kernel/drivers/input/ke ...
- RK3229平台Android6.0系统的一些定制性需求开发
1.默认语音.地区.时区 device/rockchip/rk322x/rk322x_box/system.prop persist.sys.language=zh #简体中文 persist.sys ...
最新文章
- 空间统计笔记之一(基础知识)
- 简述数据字典的结构及其作用_数据结构——树基本概念及其遍历
- Equipment download和自动生成的IBASE DB 信息
- 防范攻击 加强管控 - 数据库安全的16条军规
- linux下svn常用命令集锦
- imageJ 如何下载plugin_如何给微服务架构的项目做验收测试?
- Python urllib2 设置超时时间并处理超时异常
- 重置Winsock2
- CleanMyMac X2022纯净版苹果电脑管家
- C语言单循环比赛固定轮转法,高手请进,请教一道简单的c语言题!
- PL(Planet)卫星群遥感数据介绍及应用
- python中sub的用法_Python Pandas Series.sub()用法及代码示例
- Android设置系统时间和时区
- 【jzoj4826】【小澳的葫芦】【二分答案】
- 程序员如何摆脱天天CRUD这种打杂状态?
- 强基计划 数学相关书籍 推荐
- 关于STM32F4xx的GPIO
- qt add qrc - Files are not automatically added to the CMakeLists.txt
- excel中通过下拉菜单显示不同的报表内容,类似下拉选项中,一旦切换内容,后面的表格内容全都不同?
- 后端工程师之路(4)GIT工具的使用与介绍