最近接到了精简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
声明:本方法目前还存在如下缺陷,如有解决方案望告知:
ps.txt
及 ps_AF.txt
文件不能在 *.mk
中删除,貌似是阿富汗语关联,但是始终没有找到在哪里被调用,删除会报错zh_CN.txt
文件,则要将以 zh
开头的所有txt文件都保留,即全部保留在 *.mk
中,因为在脚本中是使用的对 zh.txt
及 zh_*.txt
这样的遍历方式,如果只删除了部分文件会提示can not open xxx.xx
也就是文件缺失fq
技术是必须的(icu_PATH)/data/
目录下)首先说明,所谓的裁剪,并非是将文件夹内的 *.txt
文件直接删除,而是通过修改 *.mk
文件来屏蔽掉不需要的字库。修改时注意上文声明的两点。
其次强调一下 .mk
的简单语法,知道的可以略过。 #
号代表注释后面一行的内容,每个txt文件的文件名要用空格隔开,如需换行要在行尾打 \
且后面不能有任何的空格或其他字符,每行之间不能有无关字符混入,注释也不可以,所以注释的话要移到文件尾部。
#
注释掉不需要的文件名并直接移至文件尾部(当然也可以考虑直接删除,不过这样就没后路了)brklocal.mk
文件,并将 brkfiles.mk
的内容复制进去,然后删除不需要的文件名即可collocal.mk
文件,并将 collfiles.mk
的内容复制进去,然后删除不需要的文件名即可spreplocal.mk
文件,并将 spregfiles.mk
的内容复制进去,然后删除不需要的文件名即可trnslocal.mk
文件,并将 trnsfiles.mk
的内容复制进去,然后删除不需要的文件名即可reslocal.mk
文件,并将resfiles.mk
的内容复制进去,然后删除不需要的文件名即可misclocal.mk
文件,并将 miscfiles.mk
的内容复制进去,然后删除不需要的文件名即可icudt51l.dat
文件
|
|
|
|
|
|
|
|
编译过程中如果出现 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
一下即可
|
|
system.img
赶紧刷到手机里或者模拟器里看看效果吧本人也是刚入行的菜鸟,可能解决方法并不完美,也存在一些无法解决的问题,本文旨在为大家提供一些思路,少走一点弯路,如果有什么好的意见和建议欢迎留言或者email我,另提一句,我将语言精简到只剩三个, system.img
大概缩小了10m左右。
以下提供一些参考网站:
官方文档(推荐阅读,不过需要fq以及不错的英文水平)
参考文档(大概是我搜到的所有中文文档了,算是做个归纳吧)
原文链接:http://chenggoi.com/2015/01/06/Android_ICU_Customizing/,转载请注明出处。