微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 俄罗斯时区更新问题

俄罗斯时区更新问题

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
10月26日开始,俄罗斯全国时区将在目前基础上向后推迟一个小时。以首都莫斯科为例,目前时间比格林尼治时间早4个小时,10月26日之
后,莫斯科时间将比格林尼治时间早3个小时。最为直观的是,把手机时间从2014年10月26日之前调整到之后Moscow时区将由GMT:+4变成GMT:+3,
Sakhalin时区从GMT:+11变成GMT:+10。由于目前android L之前的版本Google没有主动更新时区文件,这样我们必须去修改相关文件适应这一改变。
Android的时区信息保存在2个地方:一个是bionic\libc\zoneinfo\tzdata(KK之前是zoneinfo.dat, zoneinfo.idx,zoneinfo.version),另一个是
external\icu\icu4c\data\misc\zoneinfo64.txt。因此需要更新这2处文件就行。下面主要以KK为例说明如何更新,JB的版本最后做简单说明。
[SOLUTION]
一、 更新tzdata文件
1、 在网址ftp://ftp.iana.org/tz/releases/下载tzdata*.tar.gz
1) 下载2013H版本(KK默认使用的是这个版本)作为编译版本。
2) 下载2014E或者以后的版本作为参考版本(俄罗斯时区在这个版本以后才更新)
2、 修改时区文件
分别解压2013H版本和2014E版本的下载包,打开 europe文件,搜索Russia关键字,可以找到Russia的相关的时区,如莫斯科时区定义如下
2013H版本
Zone Europe/Moscow 2:30:20 - LMT 1880
2:30 - MMT 1916 Jul 3 # Moscow Mean Time
2:30:48 Russia %s 1919 Jul 1 2:00
3:00 Russia MSK/MSD 1922 Oct
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK
2014E版本
Zone Europe/Moscow 2:30:17 - LMT 1880
2:30:17 - MMT 1916 Jul 3 # Moscow Mean Time
2:31:19 Russia %s 1919 Jul 1 2:00
3:00 Russia %s 1921 Oct
3:00 Russia MSK/MSD 1922 Oct
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s
3:00 – MSK
使用2014E的Europe/Moscow定义替换掉2013H的Europe/Moscow 定义。其他俄罗斯时区也做类似替换动作。
3、 将修改后的2013H打包并拷贝到\bionic\libc\tools\zoneinfo目录下。
4、 在bionic\libc\tools\zoneinfo\新建py文件,如update_tzdata_local.py,(脚本参考FAQ12532)。
5、 需要修改相关版本信息,和网站下载版本号保持一致,比如
- new_version = "tzdata2013h"
- filename = "tzdata2013h.tar.gz"
- current_version = "tzdata2013h"
6、 执行这个python update_tzdata_local.py
7、 如果bionic\libc\tools\zoneinfo\有 extracted、data 2个文件夹存在, 需要删除,否则会报错。如果还是报错,请换台计算机在尝试。
8、 出现下面的log说明执行ok
……
.Calling zic(1)...
Calling ZoneCompactor to update bionic to tzdata2013h...
You already have the latest tzdata (tzdata2013h)!
执行完成后bionic\libc\zoneinfo\tzdata文件会更新。
9、 可以把这个文件直接push到system/usr/share/zoneinfo,然后重新开机可以看到效果。
二、 更新zoneinfo64文件
1、 在http://site.icu-project.org/下载最新的icu资源。
(1)打开网址选择左侧列表框的DownloadICU
(2)选择“offcial Release”中最新版本的ICU4C如54.1
(3)下载“ICU4C Source Code Download”框中第一个包如“icu4c-54_l-data.zip”
2、 参考最新的ICU资源修改external\icu\icu4c\data\misc\zoneinfo64.txt
如修改Moscow时区部分使用下面部分替换掉:
/* Europe/Moscow */ :table {
trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593829879, -1589860800, -
1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000,
417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400,
591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701812800, 717534000, 733273200,
748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000,
922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400,
1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200,
1256425200, 1269730800, 1288479600, 1301180400, 1414274400 }
typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400,
0 }
typeMap:bin {
"030403050405070607080706010607060706070607060706070607060706070607060201060706070607060706070607060706070607060706070607060706070
6070607060706070607060906" }
links:intvector { 462, 618 }
}
俄罗斯其他时区也做类似处理
3、 参考FAQ04011重新编译ICU资源
三、 修改libc (android L 可以忽略此步骤)
1、修改文件/bionic/libc/tzcode/localtime.c
==================BEFORE=================
static int __bionic_open_tzdata(const char* olson_id, int* data_size) {
// TODO: use $ANDROID_DATA and $ANDROID_root like libcore, to support bionic on the host.
int fd = __bionic_open_tzdata_path("/data/misc/zoneinfo/tzdata", olson_id, data_size);
if (fd < 0) {
fd = __bionic_open_tzdata_path("/system/usr/share/zoneinfo/tzdata", olson_id, data_size);
=============AFTER==================
static int __bionic_open_tzdata(const char* olson_id, int* data_size) {
// TODO: use $ANDROID_DATA and $ANDROID_ROOT like libcore, to support bionic on the host.
int fd = __bionic_open_tzdata_path("/system/usr/share/zoneinfo/tzdata", olson_id, data_size);
if (fd < 0) {
fd = __bionic_open_tzdata_path("/system/usr/share/zoneinfo/tzdata", olson_id, data_size);
2、文件:/libcore/luni/src/main/java/libcore/util/ZoneInfoDB.java
============BEFORE===============
private static final TzData DATA =
new TzData(System.getenv("ANDROID_DATA") + "/misc/zoneinfo/tzdata",
System.getenv("ANDROID_ROOT") + "/usr/share/zoneinfo/tzdata");
============AFTER================
private static final TzData DATA =
new TzData(System.getenv("ANDROID_ROOT") + "/usr/share/zoneinfo/tzdata");
System.getenv("ANDROID_DATA") + "/usr/share/zoneinfo/tzdata ",
=============END================
四、 注意事项
1、 尽量不要直接使用新的版本(2014e)参与编译,这样容易导致CTS fail。
2、 如果只更新tzdata,没有更新ICU资源,会出现,MMS发送短信时间、日历新建事件的TimePicker等时间显示地方比
系统时间晚一个小时
3、 修改之后手机日期必须是调整为2014年10月26日凌晨1点之后,否则看不到效果。
五、 JB版本
Android4.2 Google 默认的版本是2012h,保存的时区文件也是2处,与KK不同的是KK之前的TimeZone data是由三个文件保存的
zoneinfo.dat,zoneinfo.idx,zoneinfo.version。
更新方法和KK一样,只是编译脚本不同

签到

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top