更新Android时区数据

14
我在设备上运行的是Android 4.4.3,由于它具有过时的时区信息,因此我正在尝试更新/system/usr/share/zoneinfo中的tzdata。然而,直接替换文件并不能更新时区。
根据Google AOSP团队的说法,由于ICU保留了自己的时区数据副本,因此我们还必须替换它的数据文件。更新的数据文件为 ICU更新 bionic更新
但是,当我构建并替换icu4c库(libicui18n.so和libicuuc.so)并将icudt51l.dat替换为icudt53l.dat时,系统无法初始化ICU。
我已经尝试解压缩icudt53l.dat并将其*.res文件推送到旧的icudt51l.dat中,但由于ICUPKG工具在打包之前会检查res文件的校验和,因此这也失败了。
我遵循了XDA更新tzdata的链接,但该方法失败了,因为它们使用tzdata创建zoneinfo.dat、zoneinfo.idx和zoneinfo.version文件。但系统在/system/usr/share/zoneinfo中寻找tzdata本身。
我不是时区或ICU专家,请问我是否朝错误的方向努力了,能否提供帮助。

你是在询问更新操作系统、ICU 还是两者都要更新? - Matt Johnson-Pint
我只想更新 ICU,但如果操作系统的其他组件依赖于 ICU 版本,我不介意更新操作系统。 - Robin Chander
ICU用户指南中的更新时区数据是否解答了您的问题? - Matt Johnson-Pint
我尝试将metaZones.res、timezoneTypes.res、windowZones.res和zoneinfo64.res打包到我设备上当前的icudt51l.dat中。同时更改了相应的tzdata,但仍然没有效果。 - Robin Chander
1
尝试这个:https://dev59.com/IYnda4cB1Zd3GeqPBZlL - Mohammad Hossein Gerami
就我而言 - 我也想看到一个明确的答案。我想回答,但我对 Android 中的具体实现细节不太熟悉。 - Matt Johnson-Pint
1个回答

4
不需要更新ICU或Bionic,你只需使用更新后的tzdata文件即可。同时,无需手动从IANA时区数据生成tzdata文件。你可以从bionic repo中获取已经构建好的tzdata文件。您可以在此处找到最新版本的时区数据v. 2015g的更新文件:这里。一旦下载该文件,请将其复制到设备上(例如/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中可以看出,由于在v. 2015g版本中土耳其夏令时从10月25日调整到11月8日,所以11月6日欧洲/伊斯坦布尔的时区将从EET更改为EEST


+1 我已经更换了十几次 tzdata,但从未使用 adb 的 date 命令。我注意到莫斯科的日期向后移动了一个小时,这是正确的。然而,设置应用程序仍显示 GMT+4 而不是 GMT+3。我删除了 dalvik-cache,现在它显示 GMT+3,以前从未考虑过这个问题。你知道哪些系统调用依赖于 ICU 吗? - Robin Chander
1
很遗憾,我没有找到依赖于ICU的系统调用列表。我尝试在Android存储库的JAVA部分中进行快速搜索,唯一与ICU时区有关的引用似乎是ZoneGetter.java中的TimeZoneNames。而在其他地方,它直接使用了tzdata文件,例如在ZoneInfoDB.java中。 - Mattia Maestrini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接