Android 4.4.2 ICU 语言包 精简、裁剪、定制、本地化
引言
最近接到了精简Android 4.4.2系统源码中的ICU4c语言包的任务,随即百度谷歌一通找,可是找来找去结果很不令人满意。大部分结果都是如何添加语言包实现国际化的,而且多是基于ICU48及更早的版本(也就是Android 4.2.2版本及之前版本),由于ICU51相比较旧版本在配置方面有很大改动,所以网上的方案大多行不通,特在此总结一下。
环境配置
操作系统:Ubuntu 14.04 64位
Android版本:4.4.2
ICU版本:ICU 51
gcc版本:4.4
jdk版本:1.6 71u
声明:本方法目前还存在如下缺陷,如有解决方案望告知:
- locals文件夹中的
ps.txt
及ps_AF.txt
文件不能在*.mk
中删除,貌似是阿富汗语关联,但是始终没有找到在哪里被调用,删除会报错 - 如果要保留如
zh_CN.txt
文件,则要将以zh
开头的所有txt文件都保留,即全部保留在*.mk
中,因为在脚本中是使用的对zh.txt
及zh_*.txt
这样的遍历方式,如果只删除了部分文件会提示can not open xxx.xx
也就是文件缺失 - 本文内有部分很有帮助的网站由于某些原因无法连接(你懂得),所以我觉得想做Android系统开发的话
fq
技术是必须的
正文
1. 哪些包可以被裁减(以下所列文件夹均在 (icu_PATH)/data/
目录下)
首先说明,所谓的裁剪,并非是将文件夹内的 *.txt
文件直接删除,而是通过修改 *.mk
文件来屏蔽掉不需要的字库。修改时注意上文声明的两点。
其次强调一下 .mk
的简单语法,知道的可以略过。 #
号代表注释后面一行的内容,每个txt文件的文件名要用空格隔开,如需换行要在行尾打 \
且后面不能有任何的空格或其他字符,每行之间不能有无关字符混入,注释也不可以,所以注释的话要移到文件尾部。
- 文本转换信息
- mappings/ucmfiles.mk
- mappings/ucmcore.mk
- mappings/ucmebcdic.mk
- 方法:直接用
#
注释掉不需要的文件名并直接移至文件尾部(当然也可以考虑直接删除,不过这样就没后路了) - 参考该网站可了解每个文件是干什么的(也可以通过该网站直接定制dat包,并且下面有不同版本的选择):ICU Data Library Customizer
- 基于数字规格的语音转换
- brkiter/brkfiles.mk
- 方法:修改或者新建(如果没有)
brklocal.mk
文件,并将brkfiles.mk
的内容复制进去,然后删除不需要的文件名即可 - 字符串本地化的排序比较相关
- coll/collfiles.mk
- 方法:修改或者新建(如果没有)
collocal.mk
文件,并将collfiles.mk
的内容复制进去,然后删除不需要的文件名即可
- 为网络协议提供本地化字符串转换(如网址可以输入中文,阿拉伯文等)
- spreg/spregfiles.mk
- 方法:修改或者新建(如果没有)
spreplocal.mk
文件,并将spregfiles.mk
的内容复制进去,然后删除不需要的文件名即可
- 脚本语言转化
- translit/trnsfiles.mk
- 方法:修改或者新建(如果没有)
trnslocal.mk
文件,并将trnsfiles.mk
的内容复制进去,然后删除不需要的文件名即可
- 时间,货币,计数等本地化的格式
- curr/resfiles.mk
- zone/resfiles.mk
- region/resfiles.mk
- lang/resfiles.mk
- locals/resfiles
- 方法:在相应的的文件夹下修改或者新建(如果没有)
reslocal.mk
文件,并将resfiles.mk
的内容复制进去,然后删除不需要的文件名即可
- 杂项文件
- misc/miscfiles.mk
- 方法:修改或者新建(如果没有)
misclocal.mk
文件,并将miscfiles.mk
的内容复制进去,然后删除不需要的文件名即可
2.编译修改的这些文件,生成 icudt51l.dat
文件
- 打开终端,切换到icu4c目录下
|
|
- 新建一个临时文件夹,并进入该文件夹
|
|
- 使用管理员权限运行配置文件
|
|
- 使用管理员权限编译ICU
|
|
-
编译过程中如果出现
can not open xxx
的错误请参考文章开头的声明,如果依旧无法解决则将缺少的文件添加进去即可,目前还没有出现过其他问题,如果有则只好自行百度 -
编译成功的话那么恭喜你,已经完成了一半,在
icuBuild/data/out/tmp/
文件夹中找到icudt51l.dat
文件,并将其复制到根目录下的stubdata/
文件夹中并替换掉icudt51l-all.dat
文件,并切换到该文件夹,即
|
|
- 接下来修改
icu_dat_generator.py
这个文件,找到GenResIndex()
这个函数,并屏蔽掉languages
里不需要的语言,如
|
|
- 接下来修改
icu-data-default.txt
这个文件,这个文件就是与之前的版本不同,里面的内容决定了编译的时候需要哪些文件,如果不会改的话可以先运行一下脚本
|
|
-
看看报错提示缺少什么,然后再到该文件中
Ctrl+F
,如果存在并确定无用则将其用#
注释掉,如果没有找到,就要回到最开始的步骤,将缺少的文件及其关联都添加进去,然后重新打包生成icudt51l.dat
文件并重复以上步骤,直到生成icudt51l-default.dat
即表示编译成功 -
编译成功之后删除
icuBuild
文件夹并切换到Android的根目录下对全局make
一下即可
|
|
- OK~将生成的
system.img
赶紧刷到手机里或者模拟器里看看效果吧
总结
本人也是刚入行的菜鸟,可能解决方法并不完美,也存在一些无法解决的问题,本文旨在为大家提供一些思路,少走一点弯路,如果有什么好的意见和建议欢迎留言或者email我,另提一句,我将语言精简到只剩三个, system.img
大概缩小了10m左右。
以下提供一些参考网站:
-
官方文档(推荐阅读,不过需要fq以及不错的英文水平)
-
参考文档(大概是我搜到的所有中文文档了,算是做个归纳吧)
原文链接:http://chenggoi.com/2015/01/06/Android_ICU_Customizing/,转载请注明出处。