欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android系统开发中log的使用方法及简单的原理

程序员文章站 2023-11-28 23:23:46
在程序开发过程中,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就可以查看了
Android系统开发中log的使用方法及简单的原理 

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.】