首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在亚行logcat输出中,在Android上查看Qt应用程序日志记录的最简单方法是什么?

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

Stack Overflow用户
提问于 2017-08-02 10:19:47
回答 1查看 4.1K关注 0票数 4

我是而不是的QtCreator用户。我用qmake、make和androiddeployqt在构建脚本中构建android应用程序,并通过亚行安装将它们部署到设备上。

我希望能够在abd logcat输出中看到qDebug、qInfo等的输出,以及来自qml引擎的任何QML conole.log输出和任何其他聊天。但是在Android的Qt应用程序的一个普通版本中,任何这样的信息似乎都被屏蔽了(或者至少我不知道它们会去哪里)。

我已经取得了一些成功的结合:

  • 使用qInstallMessageHandler将日志重定向到stderr (如这里所示)。
  • 使用代码这里将stderr重定向到Android日志记录。(Update:后来发现这种方法非常不能令人满意,因为它依赖另一个线程监听管道,崩溃的应用程序可能会在崩溃之前丢失日志记录)。

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

Qt版本从5.7开始引起人们的兴趣。

在谷歌搜索这个输出重定向问题时,经常提到adb shell setprop log.redirect-stdio true,但据我所知,它对Qt应用程序的stout/stderr没有任何影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-02 11:49:21

实际上,将问题中关联的两种解决方案的各个方面结合起来,至少可以将其简化为一种功能:

代码语言:javascript
代码运行次数:0
运行
复制
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);
  ...

这可以从C++获得类似于C++的消息,从QML获取console.log消息。它没有得到的是stdout/stderr输出,但是对于可以使用Qt日志记录的新代码,我可以接受这种输出。

在logcat中,QML代码Component.onCompleted: console.log("QML completed")导致

代码语言:javascript
代码运行次数:0
运行
复制
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";生成

代码语言:javascript
代码运行次数:0
运行
复制
08-02 12:27:53.562  1199  1220 I myapp : QQuickViewer setup completed

即使在QGuiApplication实例化之前就安装消息处理程序似乎也同样有效,但它不会产生任何额外的输出(我注意到iOS上的Qt在启动时向xcode控制台输出了各种各样的内容,例如性能警告链接到https://wiki.qt.io/V4,并想知道Android是否做了同样的工作;但是如果它发出任何信号,它必须在我的处理程序安装之前发出)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45458064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档