关于在安卓设备的时区校准主要是分两个方面:1)用户手动选择,根据自己实际的地点选择对应时区;2)系统自动更新,前面一篇文章介绍了时区自动更新的源头,本篇文章主要是介绍NITZ和NTP。在手动更新时区时,涉及到时区规则的更新,物理上存在的全球二十四个时区,在逻辑上不是依次按照时区相差一个小时,而是根据政治,宗教等因素逻辑划定了时区。比如中国横跨了几个时区,但都采用北京东八时区统一计时。同时,有些地方还会存在夏令时调整的问题,这就需要平台要具有更新时区规则的能力。时区规则的更新其大概是通过如下方式进行:首先,当一个地区或国家对应时区变化时,IANA(InternetAssigned Numbers Authority)进行数据库的更新并发布;其次,安卓的ODM或者OEM根据时区的更新数据库制作基于对应设备的数据更新模块;最后,相关终端在检测到需要更新时,进行更新模块下载,并重新启动相关应用,更新设备上的时区数据到最新。最后两个过程在设备端主要通过如下四个模块实现:
关于这四个模块在的具体实现,大家可以参考安卓源生的代码。在选择自动更新时区时,我们现阶段常用的是NITZ和NTP。首先对于NITZ,这个需要具有基带通信能力,通信运营商会根据IANA提供的最新时区信息,当移动终端注册到运营商网络时,会结合对应基站的小区信息,根据3GPP的规则,发送对应的讯息SystemInformationBlockType16格式的讯息到终端,基带通过解析后会通过RIL_UNSOL_NITZ_TIME_RECEIVED上报一个"yy/mm/dd,hh:mm:ss(+/-)tz,dt"字符串,最终将正确的时间讯息显示到UI中。但如果终端设备的注册基站的小区讯息处于临界点时,UI显示的时间讯息就会出现波动。NITZ的基本流程如下,中间也有一些特别的判断,大家从研究代码中就会发现。
系统服务 | RulesManagerService主要是暂存时区更新数据,默认处于停用状态,需要通过overlay机制打开config_enableUpdateableTimeZoneRules |
TimeZoneUpdater | 不可更新的系统应用,需要预制到/system/priv-app下面 |
TimeZoneData | 可更新的系统应用,同样是预制到/system/priv-app,其主要目的是获取基于OEM或ODM的最新的时区规则数据 |
tzdatacheck | 一个可执行文件,更新时区规则需要用到的工具 |