您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 浅谈Android系统开发中LOG的使用
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。在这一篇文章中,我们简单介绍在Android内核空间和用户空间中LOG的使用和查看方法。一.内核开发时LOG的使用。Android内核是基于LinuxKerne2.36的,因此,LinuxKernel的LOG机制同样适合于Android内核,它就是有名的printk,与C语言的printf齐名。与printf类似,printk提供格式化输入功能,同时,它也具有所有LOG机制的特点--提供日志级别过虑功能。printk提供了8种日志级别(linux/kernel.h):viewplain1.#defineKERN_EMERG0/*systemisunusable*/2.#defineKERN_ALERT1/*actionmustbetakenimmediately*/3.#defineKERN_CRIT2/*criticalconditions*/4.#deinfeKERN_ERR3/*errorconditions*/5.#deinfeKERN_WARNING4/*warningconditions*/6.#deinfeKERN_NOTICE5/*normalbutsignificantcondition*/7.#deinfeKERN_INFO6/*informational*/8.#deinfeKERN_DEBUG7/*debug-levelmessages*/printk的使用方法:printk(KERN_ALERTThisisthelogprintedbyprintkinlinuxkernelspace.);KERN_ALERT表示日志级别,后面紧跟着要格式化字符串。在Android系统中,printk输出的日志信息保存在/proc/kmsg中,要查看/proc/kmsg的内容,参照在Ubuntu上下载、编译和安装Android最新内核源代码(LinuxKernel)一文,在后台中运行模拟器:USER-NAME@MACHINE-NAME:~/Android$emulator&启动adbshell工具:USER-NAME@MACHINE-NAME:~/Android$adbshell查看/proc/kmsg文件:root@android:/#cat/proc/kmsg二.用户空间程序开发时LOG的使用。Android系统在用户空间中提供了轻量级的logger日志系统,它是在内核中实现的一种设备驱动,与用户空间的logcat工具配合使用能够方便地跟踪调试程序。在Android系统中,分别为C/C++和Java语言提供两种不同的logger访问接口。C/C++日志接口一般是在编写硬件抽象层模块或者编写JNI方法时使用,而Java接口一般是在应用层编写APP时使用。Android系统中的C/C++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:viewplain1./*2.*Androidlogpriorityvalues,inascendingpriorityorder.3.*/4.typedefenumandroid_LogPriority{5.ANDROID_LOG_UNKNOWN=0,6.ANDROID_LOG_DEFAULT,/*onlyforSetMinPriority()*/7.ANDROID_LOG_VERBOSE,8.ANDROID_LOG_DEBUG,9.ANDROID_LOG_INFO,10.ANDROID_LOG_WARN,11.ANDROID_LOG_ERROR,12.ANDROID_LOG_FATAL,13.ANDROID_LOG_SILENT,/*onlyforSetMinPriority();mustbelast*/14.}android_LogPriority;在system/core/include/cutils/log.h中,定义了对应的宏,如对应于ANDROID_LOG_VERBOSE的宏LOGV:viewplain1./*2.*Thisisthelocaltagusedforthefollowingsimplified3.*loggingmacros.Youcanchangethispreprocessordefinition4.*beforeusingtheothermacrostochangethetag.5.*/6.#ifndefLOG_TAG7.#defineLOG_TAGNULL8.#endif9.10./*11.*SimplifiedmacrotosendaverboselogmessageusingthecurrentLOG_TAG.12.*/13.#ifndefLOGV14.#ifLOG_NDEBUG15.#defineLOGV(...)((void)0)16.#else17.#defineLOGV(...)((void)LOG(LOG_VERBOSE,LOG_TAG,__VA_ARGS__))18.#endif19.#endif20.21./*22.*Basiclogmessagemacro.23.*24.*Example:25.*LOG(LOG_WARN,NULL,Failedwitherror%d,errno);26.*27.*ThesecondargumentmaybeNULLortoindicatetheglobaltag.28.*/29.#ifndefLOG30.#defineLOG(priority,tag,...)\31.LOG_PRI(ANDROID_##priority,tag,__VA_ARGS__)32.#endif33.34./*35.*Logmacrothatallowsyoutospecifyanumberforpriority.36.*/37.#ifndefLOG_PRI38.#defineLOG_PRI(priority,tag,...)\39.android_printLog(priority,tag,__VA_ARGS__)40.#endif41.42./*43.*================================================================44.*45.*Thestuffintherestofthisfileshouldnotbeuseddirectly.46.*/47.#defineandroid_printLog(prio,tag,fmt...)\48.__android_log_print(prio,tag,fmt)因此,如果要使用C/C++日志接口,只要定义自己的LOG_TAG宏和包含头文件system/core/include/cutils/log.h就可以了:#defineLOG_TAGMYLOGTAG#includecutils/log.h就可以了,例如使用LOGV:LOGV(ThisisthelogprintedbyLOGVinandroiduserspace.);再来看Android系统中的Java日志接口。Android系统在Frameworks层中定义了Log接口(frameworks/base/core/java/android/util/Log.java):viewplain1.................................................2.3.publicfinalclassLog{4.5.................................................6.7./**8.*Priorityconstantfortheprintlnmethod;useLog.v.9.*/10.publicstaticfinalintVERBOSE=2;11.12./**13.*Priorityconstantfortheprintlnmethod;useLog.d.14.*/15.publicstaticfinalintDEBUG=3;16.17./**18.*Priorityconstantfortheprintlnmethod;useLog.i.19.*/20.publicstaticfinalintINFO=4;21.22./**23.*Priorityconstantfortheprintlnmethod;useLog.w.24.*/25.publicstaticfinalintWARN=5;26.27./**28.*Priorityconstantfortheprintlnmethod;useLog.e.29.*/30.publicstaticfinalintERROR=6;31.32./**33.*Priorityconstantfortheprintlnmethod.34.*/35.publicstaticfinalintASSERT=7;36.37......................................................38.39.publicstaticintv(Stringtag,Stringmsg){40.returnprintln_native(LOG_ID_MAIN,VERBOSE,tag,msg);41.}42.43.publicstaticintv(Stringtag,Stringmsg,Throwabletr){44.returnprintln_native(LOG_ID_MAIN,VERBOSE,tag,msg+'\n'+getStackTraceString(tr));45.}46.47.publicstaticintd(Stringtag,Stringmsg){48.returnprintln_native(LOG_ID_MAIN,DEBUG,tag,msg);49.}50.51.publicstaticintd(Stringtag,Stringmsg,Throwabletr){52.returnprintln_native(LOG_ID_MAIN,DEBUG,tag,msg+'\n'+getStackTraceString(tr));53.}54.55.publicstaticinti(Stringtag,Stringmsg){56.returnprintln_native(LOG_ID_MAIN,INFO,tag,msg);57.}58.59.publicstaticinti(Stringtag,Stringmsg,Throwabletr){60.returnprintln_native(LOG_ID_MAIN,INFO,tag,msg+'\n'+getStackTraceString(tr));61.}62.63.publicstaticintw(Stringtag,Stringmsg){64.returnprintln_native(LOG_ID_MAIN,WARN,tag,msg);65.}66.67.publicstaticintw(Stringtag,Stringmsg,Throwabletr){68.returnprintln_native(LOG_ID_MAIN,WARN,tag,msg+'\n'+getStackTraceString(tr));69.}70.71.publicstaticintw(Stringtag,Throwabletr){72.returnprintln_native(LOG_ID_MAIN,WARN,tag,getStackTraceString(tr));73.}74.75.pu
本文标题:浅谈Android系统开发中LOG的使用
链接地址:https://www.777doc.com/doc-2312433 .html