代码之家  ›  专栏  ›  技术社区  ›  timday

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

  •  4
  • timday  · 技术社区  · 7 年前

    QtCreator用户。我使用qmake、make和androiddeployqt在构建脚本中构建android应用程序,并使用adb安装将其部署到设备上。

    我在以下方面取得了一些成功:

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

    5.7以后的Qt版本。

    adb shell setprop log.redirect-stdio true

    1 回复  |  直到 5 年前
        1
  •  1
  •   timday    7 年前

    实际上,结合问题中两个解决方案的各个方面至少可以将其简化为一个函数:

    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() << console.log 来自QML的消息。它没有得到的是stdout/stderr输出,但对于可以在整个过程中使用Qt日志的新代码,我可以接受。

    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
    

    https://wiki.qt.io/V4 并想知道安卓是否也这么做了;但如果它发出任何信息,则必须在安装我的处理程序之前发出)。