我使用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
: 所以它实际上有正确的条目,但不知何故剥离调试符号。 “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()。
答案 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调试应用程序就可以使用当前版本进程(并演示可以使用正确配置的工具链进行调试)。