如何在Android上为cmake启用去除(stripping)功能

4
我们正在开发一个带有本地部分的Android库。我们大多数是Java开发人员,不是C ++开发人员。我们微小的C ++经验足以编写我们需要的本地代码,但我们遇到了与剥离相关的意外麻烦(这与直接编程无关)。由于某些原因,我们确实需要输出剥离后的本地库(xxx.so文件)。问题是很难找到如何在我们特定情况下执行此操作的信息。谷歌上有很多结果,但我们不知道如何应用它们。最流行的答案是“只需在IDE中勾选相关复选框”。嗯,哪个复选框?我们尝试将配置中的Jni Debuggable 复选框设置为true(它看起来相关)-没有效果。我们按照以下方式添加-s标志(如许多答案所建议):
defaultConfig {
    ..
    externalNativeBuild {
        cmake {
            cppFlags "-fexceptions -s"
            abiFilters 'armeabi', 'x86'
        }
    }
}

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

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是正确的! 我之前使用的elfedit和objdump来自同一软件包,并且它们与使我困惑的相同文件配合良好。 我应用了NDK中适当的strip命令,现在它可以正常工作而不出错,但仍然没有效果。 我使用了

strip -s -v xxx.so

这段文本涉及到IT技术,其中包括语法。它显示了一条消息: 从'xxx.so' [elf32-littlearm]复制到'sta10988' [elf32-littlearm],但是'xxx.so'文件没有发生改变。那么'sta10988'是什么?一个临时文件吗?如果我的理解正确,那么这个实用工具应该能够减小库的大小,因为它包含很多符号(根据elfedit和objdump)。我尝试过应用其他strip选项(比如-I和-O),但是没有成功运行任何组合。抱歉,我不喜欢控制台应用程序。如何正确使用这个实用工具呢?

2个回答

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

有没有办法像ndk-build中的NDK_LIBS_OUT一样,将剥离的cmake构建库放在单独的文件夹(jni/libs)中,就像这样:https://stackoverflow.com/questions/32894571/why-is-ndk-build-producing-two-different-libraries-one-very-large-and-one-small - Vivek Mangal
1
@VivekMangal 看看 *CMake:面向发布构建的跨平台二进制剥离*。 - Alex Cohn

0
问题“无法识别输入文件'xxx.so'的格式”出现的原因很可能是您尝试使用系统的strip实用程序,而不是Android NDK中包含的实用程序。
例如,对于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。


更新了问题(评论大小不够)。 - Alexander Krasilnikov
如果在执行strip -s命令后文件没有发生变化,那么一切允许被剥离的内容都已经被剥离了。 - Anton Malyshev
嗯,我不确定。我构建了调试apk并从中获取了库。它应该包含一些调试信息,对吧?那么strip消息中的_sta10988_是什么?它看起来像一个输出文件,但我找不到它的位置。 - Alexander Krasilnikov
不,如果要为本地代码添加调试信息,您应该添加“-g”编译器选项。 - Anton Malyshev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接