android 系统时间同步
目录
一 概述
二 NITZ
NITZ时间设置流程示意图
三 NTP
NTP时间设置流程示意图
四 总结
一 概述
android系统支持时间的手动设置与自动设置。如果选择自动时间设置,系统会根据获取的运营商网络的NITZ信息或同ntp服务器获取的utc时间对系统时间进行设置。android系统时间设置以NITZ时间为主,NTP时间为辅。下面分别介绍一下这两种时间获取方式。
二 NITZ
下面是对NITZ的介绍,很精简直接上英文不做翻译了。
NITZ (Network Identity and Time Zone) is a mechanism for provisioning local time and date, time zone and daylight saving time(DST) offset, as well as network provider identity information, to mobile devices via a wireless network. NITZ is often used to automatically update the system clock and carrier name of mobile phones.
运营商通过在NAS层信令中的MM INFORMATION & GMM INFORMATION消息中携带NITZ信息传递给终端,一般发生在location update, CM service request, attach , routing area upate 过程之后。网络是否会发送NITZ信息取决于运营商网络的配置。
对android设备来说,首先是modem收到信令,解析出NITZ信息通过RIL(RIL_UNSOL_NITZ_TIME_RECEIVED)传递给Telephony。接下来的处理android10与之前的版本会略有不同。
Android 10之前的版本,Telephony中的ServiceStateTracker模块收到NITZ后通过调用AlarmManager API进行时间或时区的设置,并发送广播android.intent.action.NETWORK_SET_TIME 或 android.intent.action.NETWORK_SET_TIMEZONE。
Android 10版本,Telephony中的ServiceStateTracker模块收到后NITZ后,把信息传递给系统服务TimeDetectorService,在TimeDetectorService中调用AlarmManager对时间进行设置,并发送广播android.intent.action.NETWORK_SET_TIME或。而时区是在Telephony中完成设置的,之后发送广播android.intent.action.NETWORK_SET_TIMEZONE。
- public void AlarmManager.setTime(long millis),最终通过JNI,调用linux C函数settimeofday()对系统时间进行设置,并通过ioctrl操作设备结点/dev/rtc0来进行rtc时间设置。
注意:高通平台上默认禁掉了APSS设置rtc的权限,只能MPSS可以设置
- public void setTimeZone(String timeZone), 最终把timezone设置到系统属性persist.sys.timezone中
NITZ时间设置流程示意图
下图为NITZ时间设置的流程示意图,图画的不是很规范,主要为说明大致流程。
三 NTP
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
注意: NTP可以同步时间但不能同步时区。
android系统中有个系统服务NetworkTimeUpdateService,开机初始化时在system_server中启动,负责ntp时间的自动更新。所在文件为frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java。
在 frameworks/base/core/res/res/values/config.xml 文件中有对ntp服务的一些设置。
NetworkTimeUpdateService服务启动后,会监测以下三个事件:
- 开启时间自动设置
- 时间同步周期到达
- 网络变为连接状态
当任意事件到达,都会触发ntp时间同步流程,时间同步流程发起前会做一些判断,来决定是否有必要发起时间同步,时间同步是在单独handler线程中执行的。
/** Initialize the receivers and initiate the first NTP request */public void systemRunning() {registerForTelephonyIntents();registerForAlarms();HandlerThread thread = new HandlerThread(TAG);thread.start();mHandler = new MyHandler(thread.getLooper());mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback();mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler);mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED);mSettingsObserver.observe(mContext);}
/** Handler to do the network accesses on */private class MyHandler extends Handler {public MyHandler(Looper l) {super(l);}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case EVENT_AUTO_TIME_CHANGED:case EVENT_POLL_NETWORK_TIME:case EVENT_NETWORK_CHANGED:onPollNetworkTime(msg.what);break;}}}
NTP时间设置流程示意图
ntp时间获取之前会做一些判断,主要就是判断最近一段时间内是否进行过NITZ或是ntp时间同步,系统时间与NTP服务器的时间误差是否大于某个门限值,来决定是否现在就进行ntp系统时间设置。
四 总结
android系统自动时间设置主要是根据运营商的NITZ时间以及ntp服务器时间进行设置,以NITZ时间为主。NITZ可以同步时间与时区,ntp只能同步时间。GPS同样可以获取时间与时区,但目前android系统中默认时间设置没有使用gps的信息。另外局域网之间的时间同步会用到gPTP(general precise time protocol)协议基于层二传输(MAC),后面对这块了解了再补充进来。
android 系统时间同步相关推荐
- 全志 系统时间同步到RTC Patch
add 设置系统时间同步到RTC时间diff --git a/android/frameworks/base/core/java/android/app/AlarmManager.java b/and ...
- Android系统电池管理(PowerManagerService)框架分析及其在实体设备和虚拟设备上的差异(一)
0 前言 移动设备的电池一直是影响移动设备用户体验的关键问题之一,电池容量.充电速度.以及系统待机时长都在用户考虑范围内. 在众多嵌入式设备系统中,Android系统的设计的主要目的就是为了通过触摸屏 ...
- Android系统的启动过程
Android系统的启动过程可以简单地总结为以下几个流程: 加载BootLoader -> 初始化内核 -> 启动init进程 -> init进程fork出Zygote(孵化器)进程 ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...
- android运行过程简书,Android系统的启动流程
Android系统有哪些进程 在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程.注意:SystemServer进程不在init.rc里,因为SystemServer进程是由z ...
- Android系统的命令行操作及C程序编译
在Android系统执行C程序,需要使用Android系统的专用编译器NDK,下载NDK工具可以通过以下博文中给出的链接: https://blog.csdn.net/baidu_35904821/a ...
- 简单几步让CentOS系统时间同步
在使用CentOS系统的时候,我们可能会遇到时间不准的问题,那我们如何解决这个我问题呢,下面就来教大家一个CentOS系统时间同步的方法,希望大家可以解决自己所存在的疑问. CentOS系统时间同步的 ...
- NDK JNI方式读写Android系统的demo(二)
NDK & JNI(方式读写Android系统的Demo) 大家都知道Android系统是一种基于Linux的自由及开放源码的操作系统,所以读写GPIO也可以直接用Linux那一套export ...
- android系统的iphone,iPhone上安装Android系统详细步骤。
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在iphone安装android系统的详细步骤 首先,准备好iphone的多点触屏和wlan固件.因为法律的缘故,我们不能分享这些文件,你可以去ipsw文 ...
- Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】
本文转载自:http://blog.csdn.net/songze_lee/article/details/72808631 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.安装ssh服务器 ...
最新文章
- 测绘技术的发展与分类简述
- 填坑-十万个为什么?(22)
- Confluence 6 配置系统属性
- 仿抖音注册Dialog实现
- java 单例模式打包jar_在 Spark 中实现单例模式的技巧
- 【随笔】写在2014年的第一天
- java基础—GUI概述
- 不要误解【流程管理】这个概念
- $ is not defined与SpringMVC访问静态资源
- 【转贴】谈论 Direct3D10特性预览
- mos管的rc吸收电路计算_RC阻容吸收计算公式
- java word 水印_java操作word水印
- SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改
- 软件需求分析(第九章)
- x86汇编_SHLD/SHRD双精度左右移指令_笔记49
- 把PotPlayer设为默认视频播放器
- Java多线程读取文件
- debian安装rar
- re0:从零开始的Java学习生活09(连载)
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x9a in position 174: illegal multibyte sequence