Android中LOG机制详解(上)

本文深入解析了Android中Log的实现架构,从Log类的使用到其在Linux中的设备处理方式,详细介绍了Log的分类、优先级及输出流程,并探讨了Log类的Java实现。
本文整理编辑自 http://www.2cto.com/kf/201107/98203.html
一、简介
Android 中LOG的实现架构如下图所示,这基本上也是Android的某个模块实现各个层次的经典架构。
图1
Android中LOG机制详解(上) - hubingforever - 民主与科学
 

 Android应用程序通过Framework提供的Log类来进行日志的输出;而Log类其实是通过JNI函数来进行日志输出;JNI函数则是调用底层库函数进行日志的输出;然后库函数通过操作映射的设备文件操作设备。
在Linux中,系统其实把LOG作为一种设备处理,并把它映射为文件。因此库函数操作映射的LOG文件, 其实是通过kernel中的 LOG的Driver 完成相应的操作
关于Android中LOG实现架构更详细的流程图请参考《 Android LOG机制流程图
二、类android.util.Log
Android的Java程序通过android.util.Log类来输出Log,下图2.1列出了我们常用的Log的静态方法。
图2.1
Android中LOG机制详解(上) - hubingforever - 民主与科学
 
   一般,要输出Log信息,可直接调用 Log.v()/Log.d()/Log.i()/Log.w()/Log.e() 等类方法。这里之所以有这么多有区分的方法,这也是Log的分类。Log的分类就如同Log的静态常量成员定义的那样,而Log的优先级按照数字大小排列,数字大的优先级高。 Log.wtf() 一般用于输出的非常致命的FAULT信息(What  a Terrible Failure),报这个错误,不光是在Log里记录,还要在界面上有提示,并可能杀死当前的进程。
它在输出日志的同时,它会把此处代码此时的执行路径(调用栈)打印出来。在调试时,我们可以使用它来打印当前代码的执行栈。
isLoggable() 用于判断是否需要输出日志, 如果日志的tag太长或如果要输出的LOG优先级低于当前设置的优先级,则返回false,表示不用输出该日志 。在Java程序中,用Log的方法打印Log之前,可以先用 isLoggable() 判断一下是否需要,才进行输出日志。
另外, Log.println() 能达到与 Log.v()/Log.d()/… 等方法同样的输出效果,只是在用它时,要指定对应的优先级。
2.1、类android.util.Log的java实现
      类 android.util.Log 的java实现是比较简单的。类 android.util.Log 的构造函数是私有的,并不会被实例化,只是提供了静态的属性和方法。
android.util.Log 的各种Log记录方法的实现都依赖于native的实现 println_native() Log.v()/Log.d()/Log.i()/Log.w()/Log.e() 最终都是调用了 println_native() 。如Log.d()的实现:
    public static int d(String tag, String msg) {
         return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值