在adb logcat输出中,通过Android上的Qt应用程序查看日志记录的最简单方法是什么?
NB我是不是一个QtCreator用户。我使用qmake,make和androiddeployqt在构建脚本中构建android应用程序,并使用adb install将它们部署到设备中。在adb logcat输出中,通过Android上的Qt应用程序查看日志记录的最简单方法是什么?
我希望能够在abd logcat输出中看到qDebug,qInfo等的输出以及QML引擎中的任何qml conole.log输出和其他任何chatter。但是,在Android的Qt应用程序的香草版本中,任何此类消息似乎都被黑掉(或者至少我不知道它们要去哪里)。
我已经通过组合一些成功:
重定向测井使用qInstallMessageHandler到stderr(如图here)。
使用代码here将stderr重定向到Android日志记录。
但是,这一切似乎有点笨拙和过于复杂。当然有更好更简单的方法? (例如,使用Windows上的Qt,您可以简单地使用CONFIG += console
来构建一个显示日志的控制台窗口,但该选项是Windows特定的)。
Qt版本从5.7开始感兴趣。
使用谷歌的这个输出重定向问题出现了很多关于adb shell setprop log.redirect-stdio true
的提及,不过据我所知,它对Qt apps的stout/stderr没有任何影响。
实际上,结合在问题连接的两个解决方案方面也至少减少了一个功能:
const char*const applicationName="myapp";
#ifdef ANDROIDQUIRKS // Set in my myapp.pro file for android builds
#include <android/log.h>
void myMessageHandler(
QtMsgType type,
const QMessageLogContext& context,
const QString& msg
) {
QString report=msg;
if (context.file && !QString(context.file).isEmpty()) {
report+=" in file ";
report+=QString(context.file);
report+=" line ";
report+=QString::number(context.line);
}
if (context.function && !QString(context.function).isEmpty()) {
report+=+" function ";
report+=QString(context.function);
}
const char*const local=report.toLocal8Bit().constData();
switch (type) {
case QtDebugMsg:
__android_log_write(ANDROID_LOG_DEBUG,applicationName,local);
break;
case QtInfoMsg:
__android_log_write(ANDROID_LOG_INFO,applicationName,local);
break;
case QtWarningMsg:
__android_log_write(ANDROID_LOG_WARN,applicationName,local);
break;
case QtCriticalMsg:
__android_log_write(ANDROID_LOG_ERROR,applicationName,local);
break;
case QtFatalMsg:
default:
__android_log_write(ANDROID_LOG_FATAL,applicationName,local);
abort();
}
}
#endif
...
int main(int argc,char* argv[]) {
QGuiApplication app(argc,argv);
#ifdef ANDROIDQUIRKS
qInstallMessageHandler(myMessageHandler);
#endif
app.setApplicationName(applicationName);
...
这得到的东西像qInfo() <<
消息从C++ 和console.log
消息从QML。它没有得到的是stdout/stderr输出,但我可以忍受那些可以使用Qt日志记录的新代码。
在logcat中,所述QML代码Component.onCompleted: console.log("QML completed")
导致
08-02 12:27:53.378 1199 1220 D myapp : QML completed in file qrc:///main.qml line 7 function onCompleted
和在C++代码qInfo() << "QQuickViewer setup completed";
产生
08-02 12:27:53.562 1199 1220 I myapp : QQuickViewer setup completed
安装消息处理程序QGuiApplication被实例化之前也似乎同样有效,但它不会产生任何额外的输出(我注意到iOS上的Qt在启动时向xcode控制台发出各种各样的东西,例如链接到https://wiki.qt.io/V4的性能警告,并想知道Android是否做了sa我;但是如果它发射任何东西,它必须在我的处理程序安装之前)。