目录

一 概述

二 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 系统时间同步相关推荐

  1. 全志 系统时间同步到RTC Patch

    add 设置系统时间同步到RTC时间diff --git a/android/frameworks/base/core/java/android/app/AlarmManager.java b/and ...

  2. Android系统电池管理(PowerManagerService)框架分析及其在实体设备和虚拟设备上的差异(一)

    0 前言 移动设备的电池一直是影响移动设备用户体验的关键问题之一,电池容量.充电速度.以及系统待机时长都在用户考虑范围内. 在众多嵌入式设备系统中,Android系统的设计的主要目的就是为了通过触摸屏 ...

  3. Android系统的启动过程

    Android系统的启动过程可以简单地总结为以下几个流程: 加载BootLoader -> 初始化内核 -> 启动init进程 -> init进程fork出Zygote(孵化器)进程 ...

  4. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  5. android运行过程简书,Android系统的启动流程

    Android系统有哪些进程 在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程.注意:SystemServer进程不在init.rc里,因为SystemServer进程是由z ...

  6. Android系统的命令行操作及C程序编译

    在Android系统执行C程序,需要使用Android系统的专用编译器NDK,下载NDK工具可以通过以下博文中给出的链接: https://blog.csdn.net/baidu_35904821/a ...

  7. 简单几步让CentOS系统时间同步

    在使用CentOS系统的时候,我们可能会遇到时间不准的问题,那我们如何解决这个我问题呢,下面就来教大家一个CentOS系统时间同步的方法,希望大家可以解决自己所存在的疑问. CentOS系统时间同步的 ...

  8. NDK JNI方式读写Android系统的demo(二)

    NDK & JNI(方式读写Android系统的Demo) 大家都知道Android系统是一种基于Linux的自由及开放源码的操作系统,所以读写GPIO也可以直接用Linux那一套export ...

  9. android系统的iphone,iPhone上安装Android系统详细步骤。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在iphone安装android系统的详细步骤 首先,准备好iphone的多点触屏和wlan固件.因为法律的缘故,我们不能分享这些文件,你可以去ipsw文 ...

  10. Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】

    本文转载自:http://blog.csdn.net/songze_lee/article/details/72808631 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.安装ssh服务器 ...

最新文章

  1. 测绘技术的发展与分类简述
  2. 填坑-十万个为什么?(22)
  3. Confluence 6 配置系统属性
  4. 仿抖音注册Dialog实现
  5. java 单例模式打包jar_在 Spark 中实现单例模式的技巧
  6. 【随笔】写在2014年的第一天
  7. java基础—GUI概述
  8. 不要误解【流程管理】这个概念
  9. $ is not defined与SpringMVC访问静态资源
  10. 【转贴】谈论 Direct3D10特性预览
  11. mos管的rc吸收电路计算_RC阻容吸收计算公式
  12. java word 水印_java操作word水印
  13. SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改
  14. 软件需求分析(第九章)
  15. x86汇编_SHLD/SHRD双精度左右移指令_笔记49
  16. 把PotPlayer设为默认视频播放器
  17. Java多线程读取文件
  18. debian安装rar
  19. re0:从零开始的Java学习生活09(连载)
  20. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x9a in position 174: illegal multibyte sequence

热门文章

  1. 计算不规则四边形(多边形)的面积
  2. Centos6系统yum无法使用-最新解决办法
  3. 2018校园招聘笔经面经合集:算法,机器学习,大数据方向
  4. zerglurker的C语言教程010——运算符详解(二)
  5. 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号
  6. Java SE第10章 异常处理
  7. 利率里面的BP是什么意思,bp是什么意思贷款利率
  8. 【NOIP2011提高组】观光公交
  9. SONiC(4)-Telemetry可视化
  10. 从 Factor Zoo 到 Factor War,实证资产定价走向何方?