【问题标题】:How to enable stripping for cmake on Android如何在 Android 上为 cmake 启用剥离
【发布时间】:2018-02-26 11:15:16
【问题描述】:

我们正在开发一个带有原生部分的 Android 库。我们主要是 Java 开发人员,而不是 C++。我们小小的 C++ 经验足以编写我们需要的本机代码,但我们遇到了关于剥离的意外问题(与编程没有直接关系)。由于某些原因,我们确实需要剥离输出本机库(xxx.so 文件)。问题是在我们的特殊情况下很难找到如何做到这一点的信息。谷歌有很多结果,但我们不知道如何应用它们。最受欢迎的答案是“只需选中 IDE 中的相关复选框”。嗯,什么复选框?我们尝试在配置中将 Jni Debuggable 复选框设置为 true(看起来相关) - 没有效果。我们添加了 -s 标志(如许多答案中所建议的那样),如下所示:

defaultConfig {
    ..
    externalNativeBuild {
        cmake {
            cppFlags "-fexceptions -s"
            abiFilters 'armeabi', 'x86'
        }
    }
}

没有效果。我们根据this 的答案添加了相同的标志,如下所示:

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -s")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -s")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

又没效果了!最后,我们尝试了简单的变体来手动将 strip 实用程序应用于我们的输出库(正如许多人建议的那样)。问题是实用程序说无法识别输入文件“xxx.so”的格式。奇怪...我们的 C++ 开发人员(不是 Android 开发人员)帮不了我们,他们“只检查 IDE 中的相关复选框”。我们绝对确定这应该不难,但花了很多时间来完成这项任务,并且阅读了大量页面而没有结果。

@anton-malyshev 是对的!我以前使用过同一个包中的 elfeditobjdump,它们在处理相同的文件时效果很好,这让我感到困惑。我从 NDK 应用了适当的条带,现在它可以正常工作,但什么也没做。我用过

strip -s -v xxx.so

语法,这显示消息 从 'xxx.so' [elf32-littlearm] 复制到 'sta10988' [elf32-littlearm],但 xxx.so 文件保持不变。什么是 sta10988?临时文件?如果我的理解是正确的,那么该实用程序应该减少库大小,因为它包含许多符号(根据 elfedit 和 objdump)。我尝试为 strip 应用其他选项(如 -I -O),但没有设法获得任何有效的组合。抱歉,我不喜欢控制台应用程序。如何正确使用该实用程序?

【问题讨论】:

    标签: android c++ cmake


    【解决方案1】:

    无法识别输入文件 'xxx.so' 的格式出现问题,因为您很可能尝试使用系统 strip 实用程序而不是 Android NDK 中包含的实用程序。 p>

    例如,对于 armeabi-v7a,您应该使用以下一个(更正您的 NDK 安装和版本的路径):

    android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-strip
    

    android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/bin/strip
    

    对于其他流行的架构 - 将路径中的 arm-linux-androideabi-4.9 部分更改为 aarch64-linux-android-4.9 对于 arm64-v8a 和 x86-4.9 对于 x86。

    【讨论】:

    • 更新了问题(评论大小不够)。
    • 如果文件在执行strip -s后没有改变,那么所有允许被剥离的东西都已经被剥离了
    • 嗯,我不确定。我构建了调试 apk 并从中获取了库。它应该包含一些调试信息,不是吗?剥离消息中的 sta10988 是什么?它看起来像一个输出文件,但我在任何地方都找不到。
    • 不,要包含本机代码的调试信息,您应该添加 -g 编译器选项
    【解决方案2】:

    在 Android Studio 3.2+ 中(即如果您在build.gradle 中使用externalNativeBuild),剥离的库会累积在app/build/intermediates/transforms/stripDebugSymbol 下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2015-12-27
      • 2012-10-20
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多