tzdata包:Index of /ubuntu/pool/main/t/tzdata/
官网:http://www.iana.org/time-zones
代码路径:system\timezone\input_data\iana\tzdata2017b.tar.gz
执行脚本:update-tzdata.py(执行时先soure ,lunch ,make)
生成路径: system\timezone\output_data\iana\tzdata
手机路径:system/usr/share/zoneinfo/tzdata(只替换tzdata不生效,原因在于python脚本还修改了其它文件)
下载:注释CheckSignature(latest_iana_tar_filename, signature_filename)
执行 python download-iana-data.py (可下载最新版本)
一.如何修改
比如northamerica
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Mexico 1939 only - Feb 5 0:00 1:00 D
Rule Mexico 1939 only - Jun 25 0:00 0 S
Rule Mexico 1940 only - Dec 9 0:00 1:00 D
Rule Mexico 1941 only - Apr 1 0:00 0 S
Rule Mexico 1943 only - Dec 16 0:00 1:00 W # War
Rule Mexico 1944 only - May 1 0:00 0 S
Rule Mexico 1950 only - Feb 12 0:00 1:00 D
Rule Mexico 1950 only - Jul 30 0:00 0 S
Rule Mexico 1996 2000 - Apr Sun>=1 2:00 1:00 D
Rule Mexico 1996 2000 - Oct lastSun 2:00 0 S
Rule Mexico 2001 only - May Sun>=1 2:00 1:00 D
Rule Mexico 2001 only - Sep lastSun 2:00 0 S
Rule Mexico 2002 max - Apr Sun>=1 2:00 1:00 D //1:00 D表示使用夏令时,时区基础上加1,这句话意思是从2002开始,从四月份的第一个星期天之后使用夏令时
Rule Mexico 2002 max - Oct lastSun 2:00 0 S //2002开始,10月份的最后一个星期天后使用东令时
Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24 //时区
-7:00 - MST 1927 Jun 10 23:00
-6:00 - CST 1930 Nov 15
-7:00 - MST 1931 May 1 23:00
-6:00 - CST 1931 Oct
-7:00 - MST 1932 Apr 1
-6:00 Mexico C%sT 2001 Sep 30 2:00
-6:00 - CST 2002 Feb 20
-6:00 Mexico C%sT
1.先source build/envsetup.sh ,lunch ,make整编源码
2.解压system\timezone\input_data\iana\tzdata*.tar.gz
3.修改压缩包中的northamerica文件:
将Rule Mexico 2002 max - Apr Sun>=1 2:00 1:00 D
修改为Rule Mexico 2002 max - Apr Sun>=1 2:00 0 S
4.重新打包成tar.gz文件,执行system\timezone下的update-tzdata.py脚本
python update-tzdata.py
5.重新编译刷system镜像
6.验证:将日期设置为4月10号,查看Mexico时区是否更改
二.手动设置时区流程分析
imeZoneSettings.java中的onRegionZonePreferenceClicked
→startPickerFragment
→SubSettingLauncher.launch()
→launchForResult
–>listener.startActivityForResult(intent, requestCode); //启动RegionZonePicker.java
→RegionZonePicker的OnCreate
→localeDisplayNames.regionDisplayName(regionId); //LocaleDisplayNamesImpl
TimeZoneSettings回调onActivityResult ,(获取的结果中包含regionId和tzId)
→onZonePickerRequestResult
→setDisplayedTimeZoneInfo
use(RegionZonePreferenceController.class).setTimeZoneInfo(tzInfo) //设置显示的summary
use(RegionZonePreferenceController.class).setClickable //设置是否可以点击
use(TimeZoneInfoPreferenceController.class).setTimeZoneInfo(tzInfo); //设置最下面一行的提示
三.执行update-tzdata.py报错处理
androi5.1位于 /bionic/libc/tools/zoneinfo/update-tzdata.py ,由于没有保存压缩包,而是直接通过该脚本下载,若想修改相关信息,需修改该脚本
可参考https://blog.csdn.net/qiweihua19860719/article/details/56669312
android7.1位于/external/icu/tools/update-tzdata.py,同android5一样若想修改相关信息,需修改该脚本
amdroid8.1位于/system/timezone/update-tzdata.py,之后一直这个目录下
1>android 7 Can’t check signature: No public key
注释176行的CheckSignature(filename) ,脚本默认下载tzdata2017a.tar.gz
2>更新至最新版本
脚本修改如下可下载最新版本
四.编译icu
https://icu.unicode.org/download/73 ,tzdata版本要和icu版本相对应,比如tzdata2023 对应icu73,icu4c\source\configure中搜索PACKAGE_VERSION可知道版本
https://github.com/unicode-org/icu/releases/tag/release-73-1,下载source code ,将icu4c替换
cd external/icu/icu4c/source
mkdir build && cd build
./../runConfigureICU Linux
make clean
make INCLUDE_UNI_CORE_DATA=1 //在/out/tmp/下生成icudtXXX.dat, 该文件位于模块system/usr/icu/目录下
cp -f external/icu/icu4c/source/build/data/out/tmp/icudtXXX.dat ./icu4c/source/stubdata/icudtXXX.dat //用于整体编译
//返回到代码根目录重新编译
make -j12