【发布时间】: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 是对的!我以前使用过同一个包中的 elfedit 和 objdump,它们在处理相同的文件时效果很好,这让我感到困惑。我从 NDK 应用了适当的条带,现在它可以正常工作,但什么也没做。我用过
strip -s -v xxx.so
语法,这显示消息 从 'xxx.so' [elf32-littlearm] 复制到 'sta10988' [elf32-littlearm],但 xxx.so 文件保持不变。什么是 sta10988?临时文件?如果我的理解是正确的,那么该实用程序应该减少库大小,因为它包含许多符号(根据 elfedit 和 objdump)。我尝试为 strip 应用其他选项(如 -I -O),但没有设法获得任何有效的组合。抱歉,我不喜欢控制台应用程序。如何正确使用该实用程序?
【问题讨论】: