【问题标题】:Android CMake and ndk-build produce different sized filesAndroid CMake 和 ndk-build 生成不同大小的文件
【发布时间】:2020-11-02 15:39:06
【问题描述】:

我正在尝试看看我们是否可以合理地从 ndk-build 迁移到 cmake 以构建我们的 Android 的 C++ 库。

当我使用 ndk-build 构建完全相同相同的代码以获得静态库 (.a) 时,它会生成一个 542k 的文件,而 cmake 会生成一个 1.7Mb 的文件。

我正在使用 boost 进行测试构建,只构建文件系统部分。

两者都是发布版本。

我已经搜索过是否需要特定的开关来获得大致相同的编译,但没有成功。

我正在使用 ndk 版本 19 进行构建,并带有相关的工具链文件。

这是一个已知问题吗?

【问题讨论】:

  • 我猜 .a 文件最终会链接到某个 .so 文件中?您是否比较了最终出现在 APK 中的 .so 文件的大小?与 ndk-build 相比,当您使用 CMake 时,IIRC 剥离发生在构建过程的后期。
  • .so 也是使用 ndk-build 构建的大小的 3 倍。
  • 您是在比较 APK 中的文件,而不是一些中间文件?
  • 我正在比较两个构建中 libboostfilesystem.a 的大小,以及它所链接的 .so。

标签: android cmake android-ndk ndk-build


【解决方案1】:

CMake 和 ndk-build 不一定使用相同的标志。静态库不会被剥离,因此对应用程序无关紧要的附加调试信息可能会占用大量空间。

如果最终出现在 APK 中的 .so 文件(实际上已被剥离的那个)仍然很大,请使用 https://github.com/google/bloaty 区分这两者并查看二进制文件的哪些部分更大。

【讨论】:

    【解决方案2】:

    使用 cmake 不去除调试符号,我的 ndk 版本 21.3.6528147。 使用 strip 命令去除调试符号,例如

    #for arm64-v8a
    <ndk-path>/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-strip-s -v youlib.so
    
    #for armeabi-v7a
    <ndk-path>/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-strip -s -v youlib.so
    

    另见How to enable stripping for cmake on Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2019-03-20
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多