【问题标题】:Android NDK path variable for "strip" command in CMake build tool chainCMake构建工具链中“strip”命令的Android NDK路径变量
【发布时间】:2019-04-23 20:52:31
【问题描述】:

我正在尝试为我的 Android 库添加一个 strip debug symbols 步骤,其中包括用于不同 ABI 的本机共享库,例如x86/native-lib.sox86_64/native-lib.soarm64-v8a/native-lib.so

我了解 strip 命令必须分别对应于每个 ABI。因此,我需要调用正确的 strip 命令,为此我需要在构建期间知道它的正确路径。

例如,对于 ABI x86_64,我需要有以下路径设置:

set(STRIP ~/Library/Android/android-ndk-r16b/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/bin/x86_64-linux-android-strip)

add_custom_command(TARGET ${SHARED_LIBRARY_NAME} POST_BUILD
                COMMAND ${STRIP}
                "${DIST_LIBS_DIR}/${LIB_BUILD_TYPE}/${ANDROID_ABI}/lib${SHARED_LIBRARY_NAME}.so"
                COMMENT "Strip debug symbols done on final binary.")

我需要的路径如下图所示:

所以,我的问题是:

  • 是否存在指向此路径的现有 CMake 变量,即/android-ndk-r16b/toolchains/???/prebuilt/???/bin/???-???-???-strip

  • 如果没有,有没有办法利用其他已知的 Android CMake 变量来形成此路径,例如ANDROID_NDKANDROID_ABI 等?

【问题讨论】:

  • 请注意,Android Studio(或者更准确地说,Android Gradle 插件)将为您剥离共享对象。诀窍是他们稍后执行剥离步骤,而不是作为 CMake 的一部分。
  • 这适用于应用程序项目,但对于具有本机共享 .so 的库项目,我想提供一个精简的包,而不是给客户留下一个沉重的包。

标签: android cmake android-ndk


【解决方案1】:

非常感谢 @Alex Cohn 指出文件 android.toolchain.cmake,该文件通常存在于 macOS 上的目录 ~/Library/Android/sdk/cmake/cmake_version_xxx/android.toolchain.cmake 中。

内部已经配置了许多有用的 Android CMake 变量,例如

ANDROID_NDK
ANDROID_TOOLCHAIN
ANDROID_ABI
ANDROID_PLATFORM
ANDROID_STL
ANDROID_PIE
ANDROID_CPP_FEATURES
ANDROID_ALLOW_UNDEFINED_SYMBOLS
ANDROID_ARM_MODE
ANDROID_ARM_NEON
ANDROID_DISABLE_NO_EXECUTE
ANDROID_DISABLE_RELRO
ANDROID_DISABLE_FORMAT_STRING_CHECKS
ANDROID_CCACHE

ANDROID_TOOLCHAIN_PREFIX 正是我要找的,所以我的最终 CMake 脚本如下:

add_custom_command(TARGET ${SHARED_LIBRARY_NAME} POST_BUILD
            COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
            "${DIST_LIBS_DIR}/${LIB_BUILD_TYPE}/${ANDROID_ABI}/lib${SHARED_LIBRARY_NAME}.so"
            COMMENT "Strip debug symbols done on final binary.")

而且我不需要明确从命令行向构建过程传递任何额外的参数,即DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake。因为,这个文件,即android.toolchain.cmake,已经被Android原生构建系统自动考虑在内。

【讨论】:

    【解决方案2】:

    您可以使用${CMAKE_STRIP}。当您使用 -DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake 时,它会被正确设置。如果您使用受支持的 NDK 版本的“内置”Android 支持,我希望也可以。

    【讨论】:

    • 非常感谢您指向文件android.toolchain.cmake。它确实有助于解决我的实际问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2012-02-25
    • 1970-01-01
    • 2014-06-27
    • 2015-05-04
    • 2015-01-13
    • 2012-12-13
    相关资源
    最近更新 更多