我正在我的设备上运行 Android 4.4.3 ,当然它已经过时了,我正在尝试更新/system/usr/share/zoneinfo 中的 tzdata。但是,立即替换文件不会更新时区。

由于 ICU 保留了自己的时区数据副本,因此我们也必须替换该副本(根据Google AOSP团队)。更新的数据文件为Update for ICUUpdate for bionic

但是,当我构建并替换 icu4c库(libicui18n.so和libicuuc.so)并将icudt51l.dat替换为icudt53l.dat 时,系统无法初始化ICU。

我尝试解压缩icudt53l.dat并将其* .res文件插入旧的icudt51l.dat内,但也失败了,因为ICUPKG工具在打包之前检查了res文件的校验和。

我遵循了XDA link to update tzdata,但是该方法失败了,因为他们使用tzdata创建了 zoneinfo.dat,zoneinfo.idx,zoneinfo.version 文件。但是系统会在/system/usr/share/zoneinfo中寻找 tzdata本身

我不是时区或ICU专家,如果您朝错误的方向寻求帮助,请指点我。

最佳答案

无需更新ICU或Bionic,您只需使用更新后的文件即可更改tzdata文件。同样,您也不需要从IANA时区数据手动生成文件tzdata。您可以从bionic repo中获取已经构建的tzdata。您可以找到时区数据v.2015g here的最新版本的更新文件。

下载文件后,将其复制到设备上(例如/sdcard/Download/tzdata),然后打开一个 shell :

shell@maguro:/ $ su
shell@maguro:/ $ setprop persist.sys.timezone Europe/Istanbul
shell@maguro:/ $ date -s 20151106.130000
Fri Nov  6 13:00:00 EET 2015
root@maguro:/ # mount -o rw,remount /system
root@maguro:/ # cd /system/usr/share/zoneinfo/
root@maguro:/system/usr/share/zoneinfo # cp tzdata tzdata.bak
root@maguro:/system/usr/share/zoneinfo # cp /sdcard/Download/tzdata tzdata
root@maguro:/system/usr/share/zoneinfo # chmod 644 tzdata
root@maguro:/system/usr/share/zoneinfo # date
Fri Nov  6 14:00:47 EEST 2015

如果在此之后仍然不起作用:
root@maguro:/ # cd /data/misc/zoneinfo/
root@maguro:/data/misc/zoneinfo # cp tzdata tzdata.bak
root@maguro:/data/misc/zoneinfo # cp /sdcard/Download/tzdata tzdata
root@maguro:/data/misc/zoneinfo # chmod 644 tzdata

如您所见,随着更新的tzdata的出现,11月6日欧洲/ Istanbul 尔的时区从EET变为EEST,因为在2015年第v版中,土耳其的DST后退时间从10月25日移至11月8日。

10-07 19:47