2017-08-02 62 views
1

NB我是不是一個QtCreator用戶。我使用qmake,make和androiddeployqt在構建腳本中構建android應用程序,並使用adb install將它們部署到設備中。在adb logcat輸出中,通過Android上的Qt應用程序查看日誌記錄的最簡單方法是什麼?

我希望能夠在abd logcat輸出中看到qDebug,qInfo等的輸出以及QML引擎中的任何qml conole.log輸出和其他任何chatter。但是,在Android的Qt應用程序的香草版本中,任何此類消息似乎都被黑掉(或者至少我不知道它們要去哪裏)。

我已經通過組合一些成功:

但是,這一切似乎有點笨拙和過於複雜。當然有更好更簡單的方法? (例如,使用Windows上的Qt,您可以簡單地使用CONFIG += console來構建一個顯示日誌的控制檯窗口,但該選項是Windows特定的)。

Qt版本從5.7開始感興趣。

使用谷歌的這個輸出重定向問題出現了很多關於adb shell setprop log.redirect-stdio true的提及,不過據我所知,它對Qt apps的stout/stderr沒有任何影響。

回答

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); 
    ... 

這得到的東西像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我;但是如果它發射任何東西,它必須在我的處理程序安裝之前)。

相關問題