在 adb logcat 输出中查看 Android 上 Qt 应用程序的日志记录的最简单方法是什么?

2024-01-02

NB I am notQtCreator 用户。我使用 qmake、make 和 androiddeployqt 在构建脚本中构建 Android 应用程序,并使用 adb install 将它们部署到设备。

我希望能够在 abd logcat 输出中看到 qDebug、qInfo 等的输出,以及任何 qml conole.log 输出和来自 QML 引擎的任何其他内容。但在 Android 的 Qt 应用程序的普通版本中,任何此类消息似乎都是黑洞(或者至少我不知道它们要去哪里)。

通过以下方面的结合,我取得了一些成功:

  • 使用重定向日志记录到 stderrqInstallMessageHandler http://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler(如图所示here https://stackoverflow.com/a/4954188/24283).

  • 使用代码将 stderr 重定向到 Android 日志记录here https://codelab.wordpress.com/2014/11/03/how-to-use-standard-output-streams-for-logging-in-android-apps/. (Update:随后发现这种方法相当不令人满意,因为它依赖于在管道上侦听的另一个线程,并且崩溃的应用程序可能会在崩溃之前立即丢失日志记录)。

但这一切似乎有点笨拙且过于复杂。当然有更好更简单的方法吗? (例如,使用 Windows 上的 Qt,您可以简单地使用CONFIG += console获取显示日志记录的控制台窗口,但该选项是 Windows 特定的)。

感兴趣的 Qt 版本从 5.7 开始。

谷歌搜索这个输出重定向问题出现了很多提及adb shell setprop log.redirect-stdio true,但据我所知,它对 Qt 应用程序的 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++ 的消息and 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 https://wiki.qt.io/V4并想知道 Android 是否也这样做;但如果它发出任何东西,它一定是在我的处理程序安装之前)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 adb logcat 输出中查看 Android 上 Qt 应用程序的日志记录的最简单方法是什么? 的相关文章

随机推荐