📁
notes
  • 目录
  • 嵌入式学习路线
  • Linux驱动开发
    • 字符设备驱动开发
    • Linux驱动开发
  • 安卓底层开发
    • 硬件抽象层
      • 安卓硬件驱动
      • 安卓硬件抽象层模块
      • 安卓硬件访问服务
      • 安卓应用
    • 智能指针
    • Logger日志系统
      • Logger日志
      • Logger写接口
      • Logcat
    • binder
      • binder
  • 操作系统
    • 操作系统的运行机制
    • 进程
  • linux一句话
    • 与网络无关的Linux
  • Linux内核0.12
    • 微型计算机组成结构
  • QT
    • 第一个QT
  • ubuntu
    • Linux使用
    • 使用notebook
    • 使用vscode
    • 使用ubuntu
    • Linux运行时格式
    • 配置samba进行win和Linux文件访问
  • shell
    • 自动打包
    • shell 概述
    • 变量
    • 条件测试
    • 控制
  • C
    • 第一条Linux_c输出
  • GTK
    • GTK入门
    • 控制件
    • 事件
    • Glade使用
  • sqlite
    • 数据库概述
    • SQL基础
    • SQLite的C编程
    • SQL语句进阶
  • web
    • CGI通用网关接口
  • 物联网
    • 物联网概述
    • 射频识别技术RFID
  • MySQL
    • MySQL的配置
  • 其他
    • Typora图床
Powered by GitBook
On this page
  • Logcat工具分析
  • 基础数据结构
  • 初始化过程
  • 日志记录的读取过程
  • 日志记录的输出过程

Was this helpful?

  1. 安卓底层开发
  2. Logger日志系统

Logcat

Logcat工具分析

将日志记录写入到Logger日志驱动程序的目的是要将它们记录起来, 等到合适的时候再将它们读取和显示出来, 从而帮助我们分析程序的行为。

分析日志查看工具Logcat的实现来学习日志记录的读取过程。

Logcat是内置在Android系统中的一个实用工具, 可以在主机上执行adb logcat命令来查看目标设备上的日志记录。

# 将Android模拟器启动起来
emulator &

# 激活Android 模拟器中的 Logcat 工具
adb logcat

就可以不断地看到Android模拟器中的日志记录输出

在Android模拟器启动之后 :

# 获得帮助
adb logcat --help

Logcat工具主要的源代码文件 :

~/Android/system/core
    include
        cutils
            logprint.h    # 处理日志记录的输出
            event_tag_map.h    # 处理日志记录的输出
            logger.h    # 定义了一些基础数据结构和宏
        android
            log.h # 定义了一些基础数据结构和宏
    liblog    # 处理日志记录的输出
        logprint.c    
        event_tag_map.c
    logcat
        logcat.cpp # Logcat工具的源代码实现

使用Logcat工具读取和显示Logger日志驱动程序中的日志记录的过程, 主要包括三个情景, 分别是工具初始化过程、日志记录的读取和输出过程

基础数据结构

struct logger_entry :

// system\core\include\cutils\logger.h

// 从Logger日志驱动程序中提取出来的

// 描述一条日志记录
struct logger_entry {
    uint16_t    len;    /* length of the payload */
    uint16_t    __pad;  /* no matter what, we get 2 bytes of padding */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    char        msg[0]; /* the entry's payload */
};

// 描述一条日志记录的最大长度, 包括日志记录头和日志记录有效负载两部分内容的长度
#define LOGGER_ENTRY_MAX_LEN        (4*1024)

// 描述日志记录有效负载的最大长度
#define LOGGER_ENTRY_MAX_PAYLOAD    \
    (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))

struct queued_entry_t :

// system\core\logcat\logcat.cpp

// 描述一个日志记录队列
struct queued_entry_t 
{
    // Logcat工具将相同类型的日志记录按照写入时间的先后顺序保存在同一个队列中,
    //这样在输出日志记录时, 沿着这个队列就可以按照时间顺序来依次输出系统中的日志信息了

    // 联合体, 用来描述一条日志记录的内容
    union 
    {
        unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1] __attribute__((aligned(4)));
        struct logger_entry entry __attribute__((aligned(4)));
    };
    // 连接下一条日志记录, 从而形成一个队列
    queued_entry_t* next;

    queued_entry_t() 
    {
        next = NULL;
    }
};

struct log_device_t :

初始化过程

日志记录的读取过程

日志记录的输出过程

PreviousLogger写接口Nextbinder

Last updated 4 years ago

Was this helpful?