add_qt_android_apk剥离共享库的调试符号

时间:2016-12-22 16:37:16

标签: android c++ qt cmake

我使用add_qt_android_apk使用Qt 5构建APK:

add_qt_android_apk(my_app_apk gustavsfairyland NAME "@string/ApplicationName"
        DEPENDS
        ${QTAV_LIBRARIES}
    )

QTAV_LIBRARIES在之前定义:

set(QTAV_LIBRARIES
        "${QTAV_FFMPEG_LIB_DIR}/libavcodec.so"
        "${QTAV_FFMPEG_LIB_DIR}/libavfilter.so"
        "${QTAV_FFMPEG_LIB_DIR}/libavformat.so"
        "${QTAV_FFMPEG_LIB_DIR}/libavresample.so"
        "${QTAV_FFMPEG_LIB_DIR}/libavutil.so"
        "${QTAV_FFMPEG_LIB_DIR}/libswresample.so"
        "${QTAV_FFMPEG_LIB_DIR}/libswscale.so"
        "${CMAKE_BINARY_DIR}/buildqtav/${QTAV_LIB_DIR}/libQtAV.so"
        "${CMAKE_BINARY_DIR}/buildqtav/${QTAV_LIB_DIR}/libQtAVWidgets.so"
    )

我使用调试模式(user.conf)构建libQtAV.so:

CONFIG += no_config_tests
CONFIG += config_avutil config_avformat config_avcodec config_swscale config_swresample

CONFIG -= release
CONFIG += debug

当我使用nm检查符号时,我会得到许多符号:

nm ../buildqtav/lib_android_arm/libQtAV.so
00062884 t $a
00061d88 t $a
0005f9d0 t $a
...

但是当我在libs目录中的复制库上使用nm时,我得不到任何结果:

bash-4.3$ nm armeabi-v7a/libQtAV.so 
nm: armeabi-v7a/libQtAV.so: no symbols

add_qt_android_apk是否删除了调试符号?

在Qt APK的CMake模块中,我发现了这个:

 if(EXTRA_LIBS)
        set(EXTRA_LIBS "${EXTRA_LIBS},${LIB}")
    else()
        set(EXTRA_LIBS "${LIB}")
    endif()
    endforeach()
    set(QT_ANDROID_APP_EXTRA_LIBS "\"android-extra-libs\": \"${EXTRA_LIBS}\",")

所以它使用指定的外部.so路径。然后将其添加到CMake变量QT_ANDROID_APP_EXTRA_LIBS中的qtdeploy.json中。哪个有条目

buildandroidarmeabi-v7a/buildqtav/lib_android_arm/libQtAV.so
extra-libs中的

: 所以它实际上有正确的条目,但不知何故剥离调试符号。 “libs”文件夹中的库大小为1.1 MiBytes,而“lib_android_arm”中的原始库大小为1.6 MiBytes。

我希望看到使用ndk-stack的例程,此刻打印出来:

Stack frame #05 pc 000b714f  /data/app/org.qtproject.gustavsfairyland-1/lib/arm/libQtAV.so: Routine ??

编辑: 我使用以下CMake模块:https://github.com/LaurentGomila/qt-android-cmake

EDIT2: 看起来androiddeployqt总是删除库的符号: http://code.qt.io/cgit/qt/qttools.git/tree/src/androiddeployqt/main.cpp

在构建应用程序时始终会调用stripLibraries()。

2 个答案:

答案 0 :(得分:0)

嗯,androiddeployqt总是会删除库以减小它们的大小。我已经为Qt打开了一个错误报告:https://bugreports.qt.io/browse/QTBUG-57771

答案 1 :(得分:0)

正如在编辑过的问题和答案中已经提到的,androiddeployqt是从.so文件中剥离debuginfo的。

我相信这里的重点是androiddeployqt不修改文件,它在生成apk的过程中创建一个副本,只有这个副本有调试信息被剥离。在构建输出中,仍然存在未修改的.so文件,其中包含调试信息,可用于调试应用程序(Qt创建者执行该AFAIK)并且可用于获取符号信息 - 我使用它来创建可读的堆栈跟踪使用breakpad crashdump文件。

我认为这也是为什么QTBUG-57771被拒绝为不完整的原因:Qt维护者认为没有充分理由让设备上有符号可用,只要使用Qt creator调试应用程序就可以使用当前版本进程(并演示可以使用正确配置的工具链进行调试)。