简单总结Android系统开发中LOG的使用
来源:互联网 发布:2017阿里云客服招聘 编辑:程序博客网 时间:2024/03/29 19:52
在Android系统中,提供了简单、便利的LOG机制,开发人员可以方便地使用。下面简单介绍在Android内核空间和用户空间中LOG的使用和查看方法。
一、内核开发时LOG的使用 printk提供了8种日志级别(linux/kern_levels.h):
#define KERN_EMERG KERN_SOH "0" /* system is unusable */#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */#define KERN_CRIT KERN_SOH "2" /* critical conditions */#define KERN_ERR KERN_SOH "3" /* error conditions */#define KERN_WARNING KERN_SOH "4" /* warning conditions */#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */#define KERN_INFO KERN_SOH "6" /* informational */#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
printk的使用方法:
printk(KERN_ALERT”This is the log printed by printk in linux kernel space.”);
KERN_ALERT表示日志级别,后面紧跟着要格式化字符串。
在Android系统中,printk输出的日志信息保存在/proc/kmsg中,要查看/proc/kmsg的内容,
启动adb shell工具:
pengtg@pengtg:~$ adb shell
查看/proc/kmsg文件:
root@BBL7516A:/ # cat /proc/kmsg
二. 用户空间程序开发时LOG的使用。 在用户空间Android系统也提供了一套轻量级的日志系统,并且在C/C++和Java层分别提供了两种不同的接口,二者的区别是C/C++语言的logger是用于HAL层以及JNI层的开发和调试,而Java语言的logger则是用于应用层的开发和调试。
Android系统中的C/C++日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别:
/* * Android log priority values, in ascending priority order. */typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */} android_LogPriority;
在system/core/include/cutils/log.h中只是include了log/log.h
#include <log/log.h>
在/system/core/include/log/log.h中,定义了对应的宏,如对应于ANDROID_LOG_DEBUG的宏SLOGD:
/* * Simplified macro to send a debug system log message using the current LOG_TAG. */#ifndef SLOGD#define SLOGD(...) ((void)MTK_LOG_BUF_PRI(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))#endif#ifndef SLOGD_IF#define SLOGD_IF(cond, ...) \ ( (__predict_false(cond)) \ ? ((void)MTK_LOG_BUF_PRI(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ : (void)0 )#endif
因此,如果要使用C/C++日志接口,只要定义自己的LOG_TAG宏和包含头文件system/core/include/cutils/log.h就可以了:
#define LOG_TAG "MY DEBUG TAG" #include <cutils/log.h>
就可以了,例如使用LOGD:
LOGD("This is the log printed by LOGD in android user space.");
接下来看Java日志接口。Android系统在Frameworks层中定义了Log接口
(frameworks/base/core/java/android/util/Log.java):
public final class Log { /** * Priority constant for the println method; use Log.v. */ public static final int VERBOSE = 2; /** * Priority constant for the println method; use Log.d. */ public static final int DEBUG = 3; /** * Priority constant for the println method; use Log.i. */ public static final int INFO = 4; /** * Priority constant for the println method; use Log.w. */ public static final int WARN = 5; /** * Priority constant for the println method; use Log.e. */ public static final int ERROR = 6; /** * Priority constant for the println method. */ public static final int ASSERT = 7; public static int v(String tag, String msg, Throwable tr) { return println_native(LOG_ID_MAIN, VERBOSE, tag, msg + '\n' + getStackTraceString(tr)); } public static int d(String tag, String msg) { return println_native(LOG_ID_MAIN, DEBUG, tag, msg); } public static int d(String tag, String msg, Throwable tr) { return println_native(LOG_ID_MAIN, DEBUG, tag, msg + '\n' + getStackTraceString(tr)); } public static int i(String tag, String msg) { return println_native(LOG_ID_MAIN, INFO, tag, msg); } public static int i(String tag, String msg, Throwable tr) { return println_native(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr)); } public static int w(String tag, String msg) { return println_native(LOG_ID_MAIN, WARN, tag, msg); } public static int w(String tag, String msg, Throwable tr) { return println_native(LOG_ID_MAIN, WARN, tag, msg + '\n' + getStackTraceString(tr)); } public static int w(String tag, Throwable tr) { return println_native(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr)); } public static int e(String tag, String msg) { return println_native(LOG_ID_MAIN, ERROR, tag, msg); } public static int e(String tag, String msg, Throwable tr) { return println_native(LOG_ID_MAIN, ERROR, tag, msg + '\n' + getStackTraceString(tr)); } ............ /** @hide */ public static native int println_native(int bufID, int priority, String tag, String msg);}
如果要使用Java日志接口,只要在类中定义的LOG_TAG常量和引用android.util.Log就可以了:
private static final String LOG_TAG = "MY_LOG_TAG";Log.i(LOG_TAG, "This is the log printed by Log.i in android user space.");
要查看这些LOG的输出,可以配合logcat工具,在Android Studio就可以查看。也可以在命令端直接使用adb logcat 命令查看。
- 简单总结Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用--LOG(3)
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- Android系统开发中LOG的输出与使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- 浅谈Android系统开发中LOG的使用
- Activity相关工具类
- 百炼:4131:Charm Bracelet
- python安装
- 使用navigator.userAgent来判断浏览器类型
- 分布式系统架构的内功心法
- 简单总结Android系统开发中LOG的使用
- 锁屏状态弹窗
- 自己安装的DNS服务器解析公网和DNS64配置的问题
- 推荐读:MYSQL中的where条件,在数据库中提取与应用浅析
- 修改Jedis2.1版本 多线程并发错误。
- Unity3D基础篇----Shader学习笔记(4)
- 大数据和实名制的结合,让“老赖”和骗子们无处藏身
- App相关工具类
- Html5 表单属性