Android MTK开发时区修改.docx
《Android MTK开发时区修改.docx》由会员分享,可在线阅读,更多相关《Android MTK开发时区修改.docx(10页珍藏版)》请在冰豆网上搜索。
![Android MTK开发时区修改.docx](https://file1.bdocx.com/fileroot1/2023-1/31/376f4094-5091-4160-baae-c55638d6c614/376f4094-5091-4160-baae-c55638d6c6141.gif)
AndroidMTK开发时区修改
[FAQ06455]【Zone】如何添加一个新的时区
问题描述:
有些项目需要出货到海外,比如非洲的一些国家,目前的版本中这些国家没有单独的时区,而是使用的如非洲东部时间,非洲标准时间等,为了提高当地用户体验,需要在setting菜单中增加一个时区,比如为出货到尼日尼亚的手机增加时区尼日尼亚拉各斯。
解决方案:
以加入Nigeria时区为例,应该如下修改:
1.找到该国家在zoneinfo中的时区信息。
时区信息的文件可以从ftp:
//munnari.oz.au/pub/下载到最新的,解压tzdata201x*.tar.gz后,在每个地区的txt文件中有城市的时区信息,搜索是否有您要添加的城市,则该时区可以添加;如果没有搜索到相关的国家或城市,则需要考虑使用别的城市的时区。
比如在africa.txt中搜索Nigeria,可以找到下面的内容:
#Nigeria
#Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Lagos 0:
13:
36- LMT 1919Sep
1:
00 - WAT
这样可以看到,尼日利亚只有一个城市可以作为时区ID,这个ID就是Africa/Lagos。
2.修改packages/apps/Settings/res/xml-xx-xx/timezones.xml(xx-xx表示不同的语言和区域),添加下面的内容:
--timezones.xml用于在setting中增加一个时区设置项-->
Lagos
3.修改framework/base/core/res/res/xml/time_zones_by_country.xml,添加下面的内容
--time_zones_by_country.xml这个用于自动匹配时区时使用,通过countrycode找一个时区-->
--Nigeria,1:
00-->
Africa/Lagos
--这里的code="ri"表示国家代码,比如中国对应cn,美国对应us,不清楚可以维基百科查询ISO_3166-1-->
这是添加一个时区的步骤,如果要添加多个时区,请重复或批量执行以上步骤。
[FAQ08718]如何在ICU中自定义某个时区的显示名称
【Description】:
目前对于有些地区,很多国家会使用一个时区,显示的名称也是一样,比如对于欧洲,很多城市使用“欧洲中部时间”“中欧夏令时”,非洲国家也是类似的。
对于有些客户,可能有定制显示需求,对于某些时区,不显示“xx中部时间”,而是显示“xx时间”,比如下面会以荷兰阿姆斯特丹为例,目前在手机Setting中选择“Amsterdam,Berlin”后在Date&Time界面会显示“CentralEuropeanSummerTime”,下面是修改荷兰语下这个显示为自定义名称的过程。
【Solution】:
时区Europe/Amsterdam目前显示出来的时间是“欧洲中部时间”或“欧洲中部时间”,如果要修改荷兰语下显示为“阿姆斯特丹时间”或其他自定义的显示,请follow下面的修改:
1.找到时区ID
时区id并不是城市名称,手机显示到时区列表上的时区名称与时区id有映射关系,可以通过查看Settings中的timezones.xml来确定,package/apps/Settings/res/xml-zh/timezones.xml是中文。
这样可以找到Amsterdam,Berlin的时区id是Europe/Amsterdam。
2.修改metaZones.txt文件
1)修改mapTimezones
修改的目的是把时区添加到自己定义的显示规则中,这样通过时区IDEurope/Amsterdam就可以得到该显示规则Europe_Amsterdam。
这个步骤分2步:
a)定义自己的显示规则名称
比如我定义了新的规则Europe_Amsterdam,需要在mapTimezones中添加进去,mapTimezones中顺序是按字母排序的,所以Europe_Amsterdam这个规则要添加到Europe_Central的前面,如下:
Europe_Amsterdam{
}
b)将要修改的时区从原规则中删除,添加到自定义的规则中
找到要修改的时区,比如Europe/Amsterdam在Europe_Central中,
剪切NL{“Europe/Amsterdam”},粘贴到自定义的时区显示规则中,如下所示:
Europe_Amsterdam{
NL{"Europe/Amsterdam"}
}
2)修改metaZoneinfo
添加meta信息,这样就可以通过显示规则名称Europe_Amsterdam得到meta信息Europe:
Amsterdam。
"Europe:
Amsterdam"{
{
"Europe_Amsterdam"
}
}
3.修改zone/nl.txt文件
不同的txt文件代表的是不同语言,语言和区域代码可通过查询ISO-3166-1和ISO-639标准确定。
定义在界面显示的字串,这样根据之前得到的meta信息可以得到要显示的字串。
同样的,名称是按照字母排序的,所以在Europe_Central前面添加,如下:
"meta:
Europe_Amsterdam"{
ld{"夏令时间显示名称"}
ls{"标准时间显示名称"}
}
4.编译ICU资源
请参考FAQ04011进行编译和测试
[FAQ04011]如何编译ICU资源
如果只是测试修改后效果,执行步骤A即可;如果需要build后生效,则需要执行全部步骤
A.在临时目录中编译ICU资源
1.在external/icu4c下新建临时目录icubuild,进入icubuild目录
$mkdirexternal/icu4c/icuBuild
$cdexternal/icu4c/icuBuild
2.执行icuConfigureRunLinux命令,生成make文件
$.././runConfigureICULinux
3.执行make-j2命令
$make-j2
4.将生成的external/icu4c/icuBuild/data/out/tmp/icudt48l.datpush到手机测试
$adbremount
$adbpushexternal/icu4c/icuBuild/out/data/tmp/icudt48l.datsystem/usr/icu/
$adbreboot(千万记得重启手机才看得到修改后的效果)
注:
JB及以上是icudt48l.dat
B.COPY所需文件
将第一步生成的external\icu4c\icubuild\data\out\tmp\icudt48l.dat复制到external\icu4c\stubdata下并改名为icudt48l-all.dat,覆盖原来的同名文件
注:
JB及以上是icudt48l.dat和icudt48l-all.dat
C.配置环境变量
重新配置环境变量(如果不配置正确会导致执行脚本出错)。
以我的系统为例,配置过程如下:
1. 在终端中进入/work/pro/c70_u10_y320/mt6572_jb3目录即:
$cd/work/pro/c70_u10_y320/mt6572_jb3
2. 然后执行脚本(等价于./build/envsetup.sh):
$sourcebuild/envsetup.sh
3. 配置环境变量(注意“=”前后不要有空格)。
$exportANDROID_BUILD_TOP=/home/ckt/work/pro/c70_u10_y320/mt6572_jb3
执行完没有任何提示说明配置成功。
执行完没有任何提示说明配置成功,有提示说明配置出错。
需要重新配置
D.执行脚本,重新生成.dat文件
执行脚本,如果遇到文档印尼语错误请用附件(或MTK)提供的脚本(icu_dat_generator.rar)替换后再执行,如下所示:
1.进入/work/pro/c70_u10_y320/mt6572_jb3/external/icu4c/studdata目录
$cdexternal/icu4c/stubdata
2.执行脚本
$./icu_dat_generator.py
如果该脚本执行成功,external\icu4c\stubdata\icudt48l-default.dat会更新,如果看到文件的修改时间变成了最新的时间,就说明已经重新生成,真正最后起作用的是icudt48l-default.dat这个文件。
注:
JB及以上是icudt48l-default.dat
E.重新编译工程
修改后重新编译工程来测试效果,使用./mkckt72_we_jb3new命令
F.上传.dat文件到SVN
如果你使用svn或类似软件进代码管理,那么就要将你修改的结果上传到服务器上,使服务器new或build之后可以看到修改效果。
需要上传那些文件呢?
请将studdata目录下的icudt48l-default.dat文件上传。
说明:
实际上脚本的作用就是将icudt48l-all.dat解压后,根据txt文件内容重新生成icudt48l-default.dat文件,在build的时候Android.mk文件会直接将icudt48l-default.dat文件改名后复制到最终out目录中,所以上传到服务器只需要将生成的这些.dat文件传上去,其它在本机修改的都不用(如果传上去可能会build出错)。
根据上面的FAQ文档做了两个实验
实验一。
在ICU中添加某个时区并显示自定义名称,同时开机向导中也显示此修改的自定义名称
【问题描述】添加时区Abidjan
步骤:
1.在frameworks/base/core/res/res/xml/time_zones_by_country.xml中搜索是否存在有关Abidjan的时区ID。
--COTED'IVOIRE,0:
00-->
Africa/Abidjan//时区ID
2.在packages/apps/Settings/res/xml/timezones.xml中搜索时区ID是否存在时区设置项(Settings->Date&time->Selecttimezone)对应的名称。
如果没有可以按照timezones.xml其它时区编写规则添加:
Abidjan
3.在external/icu4c/data/misc/metaZones.txt中搜索是否有匹配时区idAfrica/Abidjan的mapTimezones。
搜索结果:
GMT{
001{"Atlantic/Reykjavik"}
BF{"Africa/Ouagadougou"}
CI{"Africa/Abidjan"}//在这里
GB{"Europe/London"}
GH{"Africa/Accra"}
GM{"Africa/Banjul"}
GN{"Africa/Conakry"}
IE{"Europe/Dublin"}
LR{"Africa/Monrovia"}
ML{"Africa/Bamako"}
MR{"Africa/Nouakchott"}
SH{"Atlantic/St_Helena"}
SL{"Africa/Freetown"}
SN{"Africa/Dakar"}
ST{"Africa/Sao_Tome"}
TG{"Africa/Lome"}
}
由结果可知该时区ID会显示格林治标准时区,如何修改为自定义的时区呢?
(1)删除CI{"Africa/Abidjan"}这项
(2)mapTimezones中自定义时区规则,由于mapTimezones中顺序是按字母排序的,所以将Africa_Abidjan这个规则添加在Afghanistan{001{"Asia/Kabul"}}规则之后。
Africa_Abidjan{
001{"Africa/Abidjan"}
}
(3)metazoneInfo添加meta信息(按字母排序)
"Africa:
Abidjan"{
{
"Africa_Abidjan",
}
}
4.在external/icu4c/data/zone/en.txt中添加显示字符串(按字母排序)
"meta:
Africa_Abidjan"{
ls{"AbidjanTime"}//自定义字符串
}
到此修改就结束了,修改完后可以按照[FAQ04011]如何编译ICU资源编译验证,
如果要设置开机向导显示自定义时区,即设置默认时区
需要在mediatek/config/ckt72_we_jb3/ProjectConfig_ckt.mk中设置TIMEZONE=Africa/Abidjan
验证图片:
1.开机向导显示添加时区
2.自定义字符串
3添加时区选项
实验二。
添加一个新时区
【问题描述】添加新时区乌鲁木齐Urumqi+8:
00
先上图
步骤跟上面添加Abidjan时区大同小异,举这个例子是想说明:
在metaZones.txt中搜索到的有关Urumqi的metazoneInfo代码是
"Asia:
Urumqi"{
{
"Urumqi",
"1970-01-0100:
00",
"1980-04-3018:
00",
}
{
"China",
"1980-04-3018:
00",
"9999-12-3123:
59",
}
}
必须修改为
"Asia:
Urumqi"{
{
"Urumqi",//meta信息用于跟en.txt文件中meta信息作匹配,如果两个文件}里的meta信息不一样,自定义的字符串就不会显示,修改不正确
}此处会显示为GMT+8:
00,GMT+8:
00