当前位置: 首页 > 工具软件 > ICU4C > 使用案例 >

Android 4.4.2 ICU 语言包 精简、裁剪、定制、本地化

韩佐
2023-12-01

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

声明:本方法目前还存在如下缺陷,如有解决方案望告知:

  1. locals文件夹中的 ps.txt 及 ps_AF.txt 文件不能在 *.mk 中删除,貌似是阿富汗语关联,但是始终没有找到在哪里被调用,删除会报错
  2. 如果要保留如 zh_CN.txt 文件,则要将以 zh 开头的所有txt文件都保留,即全部保留在 *.mk 中,因为在脚本中是使用的对 zh.txt 及 zh_*.txt 这样的遍历方式,如果只删除了部分文件会提示can not open xxx.xx 也就是文件缺失
  3. 本文内有部分很有帮助的网站由于某些原因无法连接(你懂得),所以我觉得想做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目录下
1
$ cd ~ /workspace/external /icu4c/
  • 新建一个临时文件夹,并进入该文件夹
1
2
$ mkdir icuBuild
$ cd icuBuild/
  • 使用管理员权限运行配置文件
1
$ sudo ../runConfigureICU Linux
  • 使用管理员权限编译ICU
1
$ sudo make -j2
  • 编译过程中如果出现 can not open xxx 的错误请参考文章开头的声明,如果依旧无法解决则将缺少的文件添加进去即可,目前还没有出现过其他问题,如果有则只好自行百度

  • 编译成功的话那么恭喜你,已经完成了一半,在 icuBuild/data/out/tmp/ 文件夹中找到icudt51l.dat 文件,并将其复制到根目录下的 stubdata/ 文件夹中并替换掉icudt51l-all.dat 文件,并切换到该文件夹,即

1
2
$ cp data/out/tmp/icudt51l.dat ../stubdata/icudt51l- all.dat
$ cd ../stubdata/
  • 接下来修改 icu_dat_generator.py 这个文件,找到 GenResIndex() 这个函数,并屏蔽掉 languages里不需要的语言,如
1
2
3
4
5
6
7
8
9
10
11
12
13
languages = [
# Group 0.
'en',
# Group 1.
#'ar',
'zh',
#'nl',
#'fr',
#'de',
#'it',
#'ja',
...
  • 接下来修改 icu-data-default.txt 这个文件,这个文件就是与之前的版本不同,里面的内容决定了编译的时候需要哪些文件,如果不会改的话可以先运行一下脚本
1
$ ./icu_dat_generator. py
  • 看看报错提示缺少什么,然后再到该文件中 Ctrl+F ,如果存在并确定无用则将其用 # 注释掉,如果没有找到,就要回到最开始的步骤,将缺少的文件及其关联都添加进去,然后重新打包生成 icudt51l.dat 文件并重复以上步骤,直到生成 icudt51l-default.dat 即表示编译成功

  • 编译成功之后删除 icuBuild 文件夹并切换到Android的根目录下对全局 make 一下即可

1
2
3
$ rm -rf icuBuild/
$ cd ../../..
$ make -j4
  • OK~将生成的 system.img 赶紧刷到手机里或者模拟器里看看效果吧

总结

本人也是刚入行的菜鸟,可能解决方法并不完美,也存在一些无法解决的问题,本文旨在为大家提供一些思路,少走一点弯路,如果有什么好的意见和建议欢迎留言或者email我,另提一句,我将语言精简到只剩三个, system.img 大概缩小了10m左右。

以下提供一些参考网站:

原文链接:http://chenggoi.com/2015/01/06/Android_ICU_Customizing/,转载请注明出处。


 类似资料: