如何在Android上启用cmake剥离功能

时间:2018-02-26 11:15:16

标签: android c++ cmake

我们正在开发一个包含原生部分的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),但没有设法获得任何工作组合。对不起,我不是控制台应用的粉丝。如何正确使用此实用程序?

1 个答案:

答案 0 :(得分:0)

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