深圳网站设计公司在什么地方,彩票网站wordpress模板,wordpress横向导航,南充网站建设hulingwl前言
最近一直用qt开发安卓app#xff0c;一直无法用真机调试#xff0c;可能是缺什么东西。但是如果通过Qt Creator在真机上运行#xff0c;可以在电脑控制台看打印#xff08;安卓本身的日志、qDebug之类的打印#xff09;#xff0c;所以我是通过打印猜测问题所在一直无法用真机调试可能是缺什么东西。但是如果通过Qt Creator在真机上运行可以在电脑控制台看打印安卓本身的日志、qDebug之类的打印所以我是通过打印猜测问题所在这样凑合着用。
最近换了个测试机控制台就不打印了包括qDebug的一些都没有这就很难受了。
所以就学习了一下安卓的日志工具logcat查资料时发现还可以与Qt的一些打印qDebug、qInfo等结合都显示在命令行工具界面中方便查看。 知识储备
Logcat 命令行工具
安卓的日志分有优先级
V详细最低优先级D调试I信息W警告E错误F严重错误S静默最高优先级绝不会输出任何内容
如要将日志输出降低到可管理的水平可使用过滤表达式限制日志输出。
过滤表达式采用 tag:priority ... 格式其中 tag 表示您感兴趣的标记priority 表示可针对该标记报告的最低优先级。不低于指定优先级的标记的消息会写入日志。在一个过滤表达式中提供任意数量的 tag:priority 规范。一系列规范使用空格分隔。
以下是一个过滤表达式的示例该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息
adb logcat ActivityManager:I MyApp:D *:S
也可控制日志输出格式使用 -v 选项并指定下列某一受支持的输出格式
brief显示优先级、标记以及发出消息的进程的 PID。long显示所有元数据字段并使用空白行分隔消息。process仅显示 PID。raw显示不包含其他元数据字段的原始日志消息。tag仅显示优先级和标记。thread:旧版格式显示优先级、PID 以及发出消息的线程的 TID。threadtime默认值显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。time显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。
如
adb logcat -v thread 常用的命令有
adb logcat 查看输出的全部日志adb logcat -v time 带日期的日志adb logcat -v time -s Tag 。仅显示指定标签的日志信息同时带有日期 详细使用说明可看官网介绍
Logcat 命令行工具 | Android Studio | Android Developers (google.cn) qInstallMessageHandler
Message Handler用于打印出调试消息、警告、严重和致命错误消息。也就是说 qDebug(), qInfo(), qWarning(), qCritical(), qFatal()都是通过这个消息句柄打印出来的。
Qt提供了一个函数qInstallMessageHandler 用于安装消息处理函数也就是可用自定义的Message Handler 替代之前默认的。
具体可见帮助文档说明
QtGlobal - Global Qt Declarations | Qt Core 5.15.16
我们可以使用自定义的Message Handler将打印消息收集起来写入文件作为日志。
当然也可以做其他处理 比如此次是将打印信息写入安卓的日志。 代码
上面关于logcat的帮助文档中有关于写日志的描述 日志记录系统的 C/C 主接口是共享库 liblog 及其头文件 android/log.h。所有语言特定的日志记录工具包括 android.util.Log最终都会调用函数 __android_log_write。默认情况下它会调用函数 __android_log_logd_logger该函数使用套接字将日志条目发送到 logd。从 API 级别 30 开始可通过调用 __android_set_log_writer 更改日志记录函数 int __android_log_write(int prio,const char *tag,const char *text
)
Writes the constant string text to the log, with priority prio and tag tag.
下面的代码来自网络亲测可用
#ifndef QDEBUG2LOGCAT_H#define QDEBUG2LOGCAT_H#include QtMsgHandler#ifdef ANDROIDvoid installLogcatMessageHandler(const char *TAG);#else#define installLogcatMessageHandler(TAG)#endif#endif // QDEBUG2LOGCAT_H#if defined(ANDROID)#include qDebug2Logcat.h#include android/log.h#include QDebug#include QByteArraystatic const char *g_TAG 0;static void messageOutput2Logcat(QtMsgType type,const QMessageLogContext context,const QString msg){int prio ANDROID_LOG_VERBOSE;QByteArray localMsg msg.toLocal8Bit();switch (type) {case QtDebugMsg:prio ANDROID_LOG_DEBUG;break;case QtWarningMsg:prio ANDROID_LOG_WARN;break;case QtCriticalMsg:prio ANDROID_LOG_ERROR;break;case QtFatalMsg:prio ANDROID_LOG_FATAL;break;case QtInfoMsg:prio ANDROID_LOG_INFO;break;default:break;}__android_log_write(prio, g_TAG, localMsg.data());}void installLogcatMessageHandler(const char *TAG){g_TAG (TAG 0 ? QDebug : TAG);qInstallMessageHandler(messageOutput2Logcat);}#endifint main(int argc, char *argv[])
{//注册自定义的消息处理函数installLogcatMessageHandler(CustomTag);...}
运行
在电脑上通过adb连接安卓设备后调用命令行查看日志
比如 标签为“onboardTrainingLog”的带日期等信息的日志
adb logcat -v -time -s onboardTrainingLog
显示如下 附
关于通过qInstallMessageHandler实现各个平台日志可参考下面的博客
Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例-CSDN博客 结束语
有了日志感觉就有了底气。