Chromium ICU库定制裁剪

ICU库是一个支持国际化,本地化的软件库。最近在研究ICU库,有点心得,总结一下。

ICU库功能介绍

编译步骤

Chromium项目中的ICU是经过Chromium开发人员精简过的,目前在Windows环境中无法成功编译。Chromium团队也是在Linux下编译,然后把文件Push到代码仓库中。 根据README.chromium文件中“Pre-built data files are checked in with the following steps on Linux”的描述可在Linux环境成功编译:

定制词条

中文词条是存放在icusourcedatabrkitrcjdict.txt文件中的。新增一个词条然后再赋予一个权重。简单验证增加新词条的方法是在网页的文字上点击这个词条的文字,如果点击词条能够正确的分词选中,则表示新词条增加成功。

裁剪方法

ICU库实现了丰富的国际化和本地化功能支持,其功能大多是基于数据驱动的。在icusourcedata目录下面有大量的数据文件,这些数据文件也是最终组成icudtl.dat文件的大部分。 如果要裁剪ICU库,裁剪功能的难度比较大,要解决代码的编译依赖,编译选项等等。另外如果某个功能被Chromium依赖,裁剪掉会有一定风险。 裁剪ICU库的数据文件比较合适,比如仅仅是为了中文分词的cjdict.txt文件就高达3.99MB,缅甸语分词的文件burmesedict.txt有1.1MB。所以裁剪这类数据文件的效果是比较明显的。即使数据去除,这些功能代码接口还在,影响面较小。

浏览器分析

Chromium 提供的icudtl.dat文件有9.73MB,相对来说还是比较大的。目前看市面上其他的浏览器情况:

可以推测:

另外,直接用文本编辑器打开icudt.d文件,也可以看到哪些文件数据文件被编译进来了。

数据文件介绍

只有知道数据文件都是用来做什么,我们才有把握进行剪裁,否则会引入bug。在icusourcedata目录中:

文件剪裁

根据编译步骤章节的介绍,运行./source/runConfigureICU Linux –disable-layout 命令就会生成编译配置文件。在icusourcedata的子目录里有个*local.mk文件,编辑这个文件就可以决定哪些数据文件被编译。原始icudtl.dat文件有9.73MB,以下就是每个子目录迭代剪裁的情况:

这个文件裁剪是比较保守的,更激进的剪裁就不赘述了。