Android日志系统概述

Android日志系统概述

一. Log的使用

  • 平常写代码,少不了log的使用,一般应用层的开发主要使用java封装的logger访问接口 (frameworks/base/core/java/android/util/Log.java)

类似:

Log.i("tag", "This is the log printed by Log.i in android user space.");
  • jni和硬件抽象层开发,用C++封装的接口 (system/core/include/android/log.h)
   #define LOG_TAG "MY LOG TAG"
   #include <cutils/log.h>
   LOGV("This is the log printed by LOGV in android user space.");
  • 前面两个属于用户空间,内核空间的开发也提供了log接口(linux/kernel.h),在Android系统中,printk输出的日志信息保存在/proc/kmsg中.
printk(KERN_ALERT"This is the log printed by printk in linux kernel space.");

二. Log是怎么产生的

1. log的定义

  • android系统的日志系统主要以驱动程序的形式保存在内核空间,我们使用的log接口都是去使用这个驱动程序来控制android日志系统。
  • 驱动程序主要有两个文件组成(logger.h\logger.c)
logger.h
  • 定义了描述log的结构体 struct logger_entry
  • 相关宏定义
logger.c
  • 定义了保存log的结构体 struct logger_log
  • 定义了读取log的结构体 struct logger_reader
  • 定义了三个用于交互的日志设备文件

    log_main、log_events和log_radio

2. log的初始化

  • 初始化函数logger_init,初始化三个日志设备
  • 创建 /dev/log/main、/dev/log/events、/dev/log/radio三个设备文件
  • 用户空间通过读写这三个文件读写日志。

3. log的读取

  • 打开设备文件,将文件内容设置给读取log的结构体struct logger_reader

  • 函数 logger_read 开启循环,读取结构体 struct logger_reader

  • 函数 do_read_log_to_user 把位于内核空间的日志缓冲区指定的内容拷贝到用户空间的内存缓冲区

4. log的写入

  • 应用层调用java接口–> java调用JNI–> 系统运行库层的C接口–> 访问设备文件

  • 函数logger_aio_write 创建logger_entry结构体, 准备从用户空间写入设备文件

  • 调用函数 do_write_log 开启循环把logger_entry结构体写入到日志缓冲区中
  • 日志写入完毕后,还需要唤醒正在等待新日志的logger_reader进程

5. Logcat的输出


打开与初始化日志设备
  • 定义了日志设备文件上下文的结构体 log_device_t

  • 定义了日志记录的结构体 queued_entry_t

  • Logcat的入口函数 main 初始化 (如/dev/log/main ) 设备上下文结构体

  • 函数setupOutput() 输出日志内容到文件或者标准输出控制台

  • 打开日志设备文件

    • android::clearLog 函数清空日志
    • android::getLogReadableSize 函数获取日志内存缓冲区的大小
  • 函数 printf 输出日志缓冲区的大小、可读日志的大小到控制台


读取与输出日志设备
  • 函数 readLogLines,开启循环,检查设备文件可读性,创建日志记录结构体 entry

  • 函数 read 每次读取一条日志记录,设置给日志结构体 entry, 加入日志上下文结构体 log_device_t 的日志队列中去

  • 处理日志记录的丢弃、输出,下一次循环

  • 函数 printNextEntry 将由结构体 logger_entry 格式转换为 AndroidLogEntry 格式

  • 函数 android_log_processLogBuffer 将日志记录的具体信息就保存在本地结构体 AndroidLogEntry entry

  • 函数android_log_printLogLine 按照指定的格式 AndroidLogFormat 进行输出到指定文件或者标准输出控制台

三、 log的捕获

  • java层错误日志捕获:java本身提供了接口Thread.setDefaultUncaughtExceptionHandler,apk或android系统可利用该接口实现错误日志存储。
  • native层错误日志捕获:android在这种情况下会保存系统日志到/data/tombstones。
  • 其他系统日志:/data/system/dropbox, /data/anr

参考:老罗的android之旅
http://blog.csdn.net/luoshengyang/article/details/6606957

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值