如何在Yocto中移除无用区域信息以缩小libicudata.so体积?
在Yocto中缩减libicudata.so体积的正确方法
你遇到的问题大概率是filter.json没有被ICU的构建流程正确调用,或者旧的编译缓存没清理导致修改没生效。以下是可落地的解决步骤:
1. 确保bbappend文件的位置和命名正确
- 把bbappend放在你自定义layer的
recipes-support/icu/目录下,命名必须匹配主配方的版本规则,比如用icu_%.bbappend来适配所有ICU版本,避免因版本号变化导致失效。
2. 正确配置filter.json并关联到构建流程
第一步:编写filter.json文件
在bbappend同目录下创建icu/filter.json,内容如下(仅保留英文区域,按需调整):
{ "localeFilter": { "include": ["en", "en_US"], "exclude": [] }, "collation": false, "currency": false, "unit": false, "timezone": false, "transform": false, "breakIterator": false }
第二步:在bbappend中配置调用逻辑
在icu_%.bbappend里添加以下内容,确保filter.json被复制到编译目录,并让ICU构建脚本识别它:
# 让Yocto找到我们添加的filter.json文件 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" # 添加filter.json到源码资源 SRC_URI += "file://filter.json" # 告诉ICU构建时使用这个过滤配置 EXTRA_OECONF += "--with-filter-file=${WORKDIR}/filter.json"
注意:部分旧版本ICU可能使用
--enable-filter参数替代--with-filter-file,如果上面的参数不生效,可对应调整。
3. 清理缓存并重新编译ICU
之前的构建缓存会保留旧的编译结果,必须清理后重新构建:
bitbake icu -c cleansstate bitbake icu
4. 验证优化效果
- 构建完成后,查看
${WORKDIR}/build下的编译日志,搜索"filter"关键词,确认是否有加载filter.json的日志输出。 - 检查生成的
libicudata.so大小,仅保留英文区域的话,体积应该降到2MB以内。
额外优化:进一步缩减体积
如果还需要更小的尺寸,可以在bbappend中添加ICU的小型化配置:
EXTRA_OECONF += " \ --enable-small \ --disable-extras \ --disable-tests \ --disable-samples \ --disable-dyload \ "
--enable-small会启用ICU的精简模式,关闭非核心功能,进一步压缩体积。
内容的提问来源于stack exchange,提问作者PhilBot
相关产品推荐
相关产品推荐

