Android系统开发中log的使用方法及简单的原理
程序员文章站
2023-12-12 19:47:28
在程序开发过程中,log是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在android系统中,提供了简单、便利的log机制,...
在程序开发过程中,log是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在android系统中,提供了简单、便利的log机制,开发人员可以方便地使用。在平时开发过程中经常需要与log打交道,所以很有必要了解log的使用方法及简单的原理。
1、linux内核的log输出
在标准的linux内核开发过程中,使用printk,这是一个与printf输出打印齐名的函数,同样提供格式化输出功能,只是其有
打印级别且将信息保存到/proc/kmsg日志中,使用cat命令查看其信息[cat/proc/kmsg]
<spanstyle="color:#003333;font-size:14px">#definekern_emerg"<0>"/*systemisunusable*/
#definekern_alert"<1>"/*actionmustbetakenimmediately*/
#definekern_crit"<2>"/*criticalconditions*/
#deinfekern_err"<3>"/*errorconditions*/
#deinfekern_warning"<4>"/*warningconditions*/
#deinfekern_notice"<5>"/*normalbutsignificantcondition*/
#deinfekern_info"<6>"/*informational*/
#deinfekern_debug"<7>"/*debug-levelmessages*/</span>
2、android中log输出
android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。
android系统中的c/c++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:
/*
*androidlogpriorityvalues,inascendingpriorityorder.
*/
typedefenumandroid_logpriority{
android_log_unknown=0,
android_log_default,/*onlyforsetminpriority()*/
android_log_verbose,
android_log_debug,
android_log_info,
android_log_warn,
android_log_error,
android_log_fatal,
android_log_silent,/*onlyforsetminpriority();mustbelast*/
}android_logpriority;
为了使用方便,在system/core/include/cutils/log.h定义了相对应的宏:
#definelogv(...)((void)log(log_verbose,log_tag,__va_args__))
#definelogd(...)((void)log(log_debug,log_tag,__va_args__))
#definelogi(...)((void)log(log_info,log_tag,__va_args__))
#definelogw(...)((void)log(log_warn,log_tag,__va_args__))
#defineloge(...)((void)log(log_error,log_tag,__va_args__))
因为如果需要使用log输出,包含其头文件:#include<cutils/log.h>并link其动态库:liblog.so即可
#definelog_tag"xx_log_tag"//这里可以定义其输出的tag
#include<cutils/log.h>
java层打印:
importandroid.util.log;
privatestaticfinalstringtag="xx_log_tag";
log.e(tag,"thisistheerrorlogprintedbylog.iinandroiduserspace.");
3、盒子上如何获取log
a、进入shell获取log
adbkill-server
adbconnectdest-ip
adbshell【登录shell】
mount-oremount/system/system【改变权限】
logcat>>1.log
命令行输入ctrl+c回到cmd命令行,adbpullpath/1.log
b、直接在cmd命令行获取log
adbconnect连上后;
adbshell
adblogcat>>path/1.log
操作完毕后
命令行输入ctrl+c回到cmd命令行,adbpullpath/1.log
c、在terminal终端直接输出log
回车切到shell
logcat[此时即可看到打印]
4、eclipse环境下运行(安装了android插件),那么直接可以在eclipse就可以查看了
5、常用技巧
1、logcat中会打印【输出级别+log_tag名字+进程字+打印的信息】可以充分利用这些信息分析问题
i/systemserver(939):activitymanager
i/activitymanager(939):memoryclass:96
e/androidruntime(939):errorreportingwtf
第一列由log.i(e/w..决定)或者logi/loge/logw...
第二列由log_tag/tag(java)中决定,可以对于同一组模块前相同的前缀[xxx]funtion这种命名
第三列是系统进程号getpid()这值,打印线程值pthread_slef()
最后的就是自行增加的打印信息
2、调效效率或者执行时间
1、建议重点的打印增加前缀,方便查找。以[######]
2、直接利用logcat输出时间,调试执行速度,分析效率
logcat-vtime【displaythedate,invocationtime,priority/tag,andpidoftheoriginatingprocess.】
1、linux内核的log输出
在标准的linux内核开发过程中,使用printk,这是一个与printf输出打印齐名的函数,同样提供格式化输出功能,只是其有
打印级别且将信息保存到/proc/kmsg日志中,使用cat命令查看其信息[cat/proc/kmsg]
复制代码 代码如下:
<spanstyle="color:#003333;font-size:14px">#definekern_emerg"<0>"/*systemisunusable*/
#definekern_alert"<1>"/*actionmustbetakenimmediately*/
#definekern_crit"<2>"/*criticalconditions*/
#deinfekern_err"<3>"/*errorconditions*/
#deinfekern_warning"<4>"/*warningconditions*/
#deinfekern_notice"<5>"/*normalbutsignificantcondition*/
#deinfekern_info"<6>"/*informational*/
#deinfekern_debug"<7>"/*debug-levelmessages*/</span>
2、android中log输出
android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。
android系统中的c/c++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:
/*
*androidlogpriorityvalues,inascendingpriorityorder.
*/
typedefenumandroid_logpriority{
android_log_unknown=0,
android_log_default,/*onlyforsetminpriority()*/
android_log_verbose,
android_log_debug,
android_log_info,
android_log_warn,
android_log_error,
android_log_fatal,
android_log_silent,/*onlyforsetminpriority();mustbelast*/
}android_logpriority;
为了使用方便,在system/core/include/cutils/log.h定义了相对应的宏:
#definelogv(...)((void)log(log_verbose,log_tag,__va_args__))
#definelogd(...)((void)log(log_debug,log_tag,__va_args__))
#definelogi(...)((void)log(log_info,log_tag,__va_args__))
#definelogw(...)((void)log(log_warn,log_tag,__va_args__))
#defineloge(...)((void)log(log_error,log_tag,__va_args__))
因为如果需要使用log输出,包含其头文件:#include<cutils/log.h>并link其动态库:liblog.so即可
#definelog_tag"xx_log_tag"//这里可以定义其输出的tag
#include<cutils/log.h>
java层打印:
importandroid.util.log;
privatestaticfinalstringtag="xx_log_tag";
log.e(tag,"thisistheerrorlogprintedbylog.iinandroiduserspace.");
3、盒子上如何获取log
a、进入shell获取log
adbkill-server
adbconnectdest-ip
adbshell【登录shell】
mount-oremount/system/system【改变权限】
logcat>>1.log
命令行输入ctrl+c回到cmd命令行,adbpullpath/1.log
b、直接在cmd命令行获取log
adbconnect连上后;
adbshell
adblogcat>>path/1.log
操作完毕后
命令行输入ctrl+c回到cmd命令行,adbpullpath/1.log
c、在terminal终端直接输出log
回车切到shell
logcat[此时即可看到打印]
4、eclipse环境下运行(安装了android插件),那么直接可以在eclipse就可以查看了
5、常用技巧
1、logcat中会打印【输出级别+log_tag名字+进程字+打印的信息】可以充分利用这些信息分析问题
i/systemserver(939):activitymanager
i/activitymanager(939):memoryclass:96
e/androidruntime(939):errorreportingwtf
第一列由log.i(e/w..决定)或者logi/loge/logw...
第二列由log_tag/tag(java)中决定,可以对于同一组模块前相同的前缀[xxx]funtion这种命名
第三列是系统进程号getpid()这值,打印线程值pthread_slef()
最后的就是自行增加的打印信息
2、调效效率或者执行时间
1、建议重点的打印增加前缀,方便查找。以[######]
2、直接利用logcat输出时间,调试执行速度,分析效率
logcat-vtime【displaythedate,invocationtime,priority/tag,andpidoftheoriginatingprocess.】
推荐阅读
-
Android系统开发中log的使用方法及简单的原理
-
Android系统开发中log的使用方法及简单的原理
-
Bootstarp在pycharm中的安装及简单的使用方法
-
Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理详解
-
简单谈谈Android中的热修复原理
-
KNN分类算法原理及实现及sklearn中的使用方法
-
Android开发中简单的launcher概念及使用方法介绍
-
Android中可以作为Log开关的一些操作及安全性详解
-
Bootstarp在pycharm中的安装及简单的使用方法
-
简单谈谈Android中的热修复原理