鸿蒙开发中如何减小编译产物so大小?

鸿蒙开发中如何减小编译产物so大小?

阅读 931
2 个回答

一、CMakeLists.txt中添加CMake编译参数和C++编译器参数
1、设置构建类型为Release,这将关闭debug调试信息
set(CMAKE_BUILD_TYPE Release)
2、-s 剥离符号表信息
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s")
二、externalnativeoptions配置编译参数和编译器参数
模块级build-profile.json5中externalNativeOptions参数是NDK工程C/C++文件编译配置的入口,可以通过path指定CMake脚本路径、arguments配置CMake参数、cppFlags配置C++编译器参数、abiFilters配置编译架构等。
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "-DCMAKE_BUILD_TYPE=Release",
"cppFlags": "-s",
}

  1. 优化编译选项
    使用优化编译标志:在CMakeLists.txt或其他构建脚本中,设置编译器标志以优化生成的so文件。常用的标志包括-Os(优化大小),这可以在保证一定性能的同时减小文件大小。例如:
    cmake
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
    去除调试信息:通过去掉-g选项来去除调试信息,这可以显著减小so文件的大小。
    cmake
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
  2. 精简代码和资源
    检查并删除未使用的代码:利用工具(如nm、objdump)检查so文件中是否包含未使用的函数或变量,并考虑从源代码中删除这些部分。
    优化C++特性使用:避免使用不必要的C++高级特性,如RTTI(运行时类型信息)和异常处理,可以通过添加编译选项-fno-rtti和-fno-exceptions来禁用这些特性。
  3. 控制符号的可见性
    隐藏非公共符号:增加编译选项-fvisibility=hidden来隐藏非公共符号,这有助于减小so文件的大小,因为链接器可以移除那些未被外部引用的符号。
    cmake
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fvisibility=hidden")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility=hidden")
  4. 使用gc-sections特性
    去除未使用的节:在编译和链接时,使用-ffunction-sections和-fdata-sections选项,并在链接时添加-Wl,--gc-sections选项,这可以去除未使用的函数和数据节,从而减小so文件的大小。
    cmake
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
  5. 压缩so库
    配置so压缩选项:在鸿蒙开发中,可以通过修改应用模块配置文件(如module.json5)中的compressNativeLibs字段,将值配置为true,来启用so库的压缩。这样,在打包应用时,DevEco Studio会将so库文件以压缩形式打包到包中,从而减小应用包大小。
  6. 使用动态共享包HSP
    在多包场景下共享代码和资源:如果应用包含多个包(HAP、HSP),可以使用HSP(Harmony Shared Package)动态共享包在多个包之间共享代码和资源,从而避免重复拷贝,减小应用包大小。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进