首页 > 系统 > Android > 正文

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

2019-10-24 21:06:11
字体:
来源:转载
供稿:网友
LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录;在平时开发过程中经常需要与log打交道,所以很有必要了解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.】

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表