• Lv0
    粉丝20

积分1123 / 贡献0

提问0答案被采纳62文章8

[经验分享] C/C++开源三方库组件大小优化经验 原创

马迪 显示全部楼层 发表于 2023-12-23 09:30:38

问题背景

@ohos/mmkv是一个一款小型键值对存储框架,它的主要实现都是由C库mmkv来实现的,对外暴露一层arkts接口。

开发者反馈@ohos/mmkv的组件占用的空间过大,影响应用整体的大小,希望可以优化一下动态库的空间占用。 经过定位分析,发现当前组件占了8M多,其实主要就是libmmkv占了绝大部分。主要原因已找到,那么接下来就是看如何减少这个so的大小了。

解决思路

第1步:修改MAKE_BUILD_TYPE

打开MMKV的核心库配置文件build-profile.json5,在arguments 属性上添加-DCMAKE_BUILD_TYPE='Release' ,然后对库文件进行打包。

这个操作的目的是将我们的库文件打包成Release版本,Release相较于Debug版本删除了调试相关的内容和信息,开发者在使用时,一般也不需要这些信息,因此在打包时应该尽量去打Release版本的包

image.png

修改这个参数以后,重新打包生成开源三方库,包的大小从8.47MB减小到了3.02MB

第2步:对二进制执行strip操作

找到SDK的路径进入native→llvm→bin,在当前路径下执行CMD

image.png

执行llvm-strip 库文件路径

image.png strip​命令的意义:动态链接库在Linux里是以.so​结尾的文件,有两张符号表:.symtab和​​dynsym​。

.symtab:包含大量信息(包括全局符号global symbols) .dynsym:只保留.Symtab中的全局符号

. dynsym可以看作是.symtab的子集,strip命令会去掉.symtab,但不会去掉. dynsym,所以,去掉.symtab不会对库的功能造成影响。

如果要把strip操作后的so放入har包后,发现har包的体积进一步缩小为2.82MB

后来发现可以在Dev EcoStudio 中直接配置strip​的参数,在配置文件中加上,以下指令就能完成打release包和裁符号表的操作。

-DCMAKE_BUILD_TYPE='Release' -DCMAKE_C_FLAGS='-s' -DCMAKE_CXX_FLAGS='-s'

image.png

总结:

在开发应用和组件的的发布阶段,可以通过在build-profile.json5文件中配置-DCMAKE_BUILD_TYPE='Release' -DCMAKE_C_FLAGS='-s' -DCMAKE_CXX_FLAGS='-s',减少so文件的大小,进而减少应用的体积。

PS: 相关PR地址:https://gitee.com/openharmony-tpc/MMKV/pulls/57/files

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部