我们正在开发一个包含原生部分的Android库。我们主要是Java开发人员,而不是C ++。我们的C ++经验足以编写我们需要的本机代码,但我们遇到了意外的剥离问题(与编程无直接关系)。由于某些原因,我们需要剥离输出本机库( xxx.so 文件)。问题是在我们的特定情况下很难找到如何做到这一点的信息。 Google中有很多结果,但我们并不了解如何应用它们。最流行的答案是“只需检查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")
再没有效果!最后,我们尝试了直接的变体来手动将条带实用程序应用于我们的输出库(正如许多人建议的那样)。问题是该实用程序说无法识别输入文件'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),但没有设法获得任何工作组合。对不起,我不是控制台应用的粉丝。如何正确使用此实用程序?
答案 0 :(得分:0)
在Android Studio 3.2+中(也就是说,如果您在build.gradle
中使用 externalNativeBuild ),剥离的库将累积在app/build/intermediates/transforms/stripDebugSymbol
下。