HarmonyOS鸿蒙Next中修改编译配置文件参数后导致so文件异常变大的问题如何处理

HarmonyOS鸿蒙Next中修改编译配置文件参数后导致so文件异常变大的问题如何处理

【问题现象】

原so文件大小如下:

点击放大

后来在模块级build里面添加"arguments": "-v -DOHOS_STL=c++_static",本来是想要去除libc++_shared.so的,结果修改编译配置后,so文件还异常变大,如下:

【背景知识】

1. so链接方式

  • 静态链接

静态链接是将库文件编译进可执行文件中。在编译时,可以使用-static选项或者指定库文件的绝对路径来实现。静态链接的好处是可执行文件自包含,不需要依赖外部库文件,但缺点是如果多个程序使用相同的库,每个程序都会包含一份库的副本,导致so文件增大,浪费空间。

  • 动态链接

动态链接是指程序在运行时加载so库。在Linux系统中,通常使用dlopen()函数来动态加载so库。例如,你可以在C或C++程序中使用dlopen()函数来加载so库,并通过dlsym()函数获取库中函数的地址进行调用。这种方法的好处是可以在程序运行时根据需要加载不同的库,灵活性高,但需要处理库的依赖关系和路径问题。

2. so符号表

so符号表是指动态链接库(Shared Object)的符号表,它记录了动态链接库中的函数和变量等符号信息。so符号表的作用主要体现在帮助开发者在程序崩溃或出现问题时快速定位问题所在,提高调试效率。通过查看符号表,开发者可以看到动态链接库中所有函数和变量的名称、地址、大小等信息,便于定位问题。符号表剥离可以减小so文件大小。

【解决方案】

  1. 设置构建类型参数-DCMAKE_BUILD_TYPERelease来去除调试信息;
  2. 设置cppFlags参数为-s来剥离符号表信息;
  3. 设置-DOHOS_STL来修改链接方式。参考使用命令行CMake构建NDK工程
  4. 可以添加OsOz编译选项进一步减小大小,参考code-generation-options

参考配置代码:

"externalNativeOptions": {
  "path": "./src/main/cpp/CMakeLists.txt",
  "arguments": "-DOHOS_STL=c++_shared -DCMAKE_BUILD_TYPE=Release",
  "cppFlags": "-s",
}

更多关于HarmonyOS鸿蒙Next中修改编译配置文件参数后导致so文件异常变大的问题如何处理的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中修改编译配置文件参数后导致so文件异常变大的问题如何处理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,修改编译配置文件参数后导致so文件异常变大的问题

在HarmonyOS鸿蒙Next中,修改编译配置文件参数后导致so文件异常变大的问题,通常与编译优化、调试信息、符号表等因素有关。

检查编译配置文件中的优化级别

首先,检查编译配置文件中的优化级别,确保未启用过度调试选项,如-g-O0,这些选项会增加so文件大小。

确认是否启用了不必要的符号表或调试信息

其次,确认是否启用了不必要的符号表或调试信息,可以通过strip命令移除未使用的符号表。

检查是否引入了不必要的依赖库或资源文件

此外,检查是否引入了不必要的依赖库或资源文件,这些也会增加so文件体积。

确保编译工具链和SDK版本与项目需求匹配

最后,确保编译工具链和SDK版本与项目需求匹配,避免因版本不兼容导致的文件膨胀。

回到顶部