Android的log机制(1),2021大厂Android春招面试经历

本文详细介绍了Android系统的log机制,从println_native()函数出发,解析了log的打开、写入过程,涉及Logger驱动的初始化、数据结构、读写功能实现。此外,还探讨了LogCat如何读取LOG信息以及C/C++域的LOG使用方法。
摘要由CSDN通过智能技术生成

log_close(log_fds[LOG_ID_RADIO]);

log_close(log_fds[LOG_ID_EVENTS]);

log_fds[LOG_ID_MAIN] = -1;

log_fds[LOG_ID_RADIO] = -1;

log_fds[LOG_ID_EVENTS] = -1;

write_to_log = __write_to_log_null;

}

if (log_fds[LOG_ID_SYSTEM] < 0) {

log_fds[LOG_ID_SYSTEM] = log_fds[LOG_ID_MAIN];

}

}

#ifdef HAVE_PTHREADS

pthread_mutex_unlock(&log_init_lock);

#endif

return write_to_log(log_id, vec, nr);

}

基本上就是做互斥访问的保护,然后如果是第一次调用(write_to_log还指向__write_to_log_init()),就打开相应的设备文件,获取描述符,并把write_to_log指向__write_to_log_kernel()。再在__write_to_log_kernel()中具体执行写入文件操作。

看__write_to_kernel()的实现,基本就是写操作:

static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)

{

ssize_t ret;

int log_fd;

if (/*(int)log_id >= 0 &&*/ (int)log_id < (int)LOG_ID_MAX) {

log_fd = log_fds[(int)log_id];

} else {

return EBADF;

}

do {

ret = log_writev(log_fd, vec, nr);

} while (ret < 0 && errno == EINTR);

return ret;

}

总结一下,println_native()的操作,就是打开设备文件(如果还没打开),然后写入数据。而具体怎么写入的,要看Log的设备驱动Logger的实现。

(4)LOG设备驱动Logger

Log的驱动是在kernel/drivers/staging/android/Logger.c中实现的。

一、初始化

看一个LINUX驱动,先看它如何初始化的。

static int __init init_log(struct logger_log *log)

{

int ret;

ret = misc_register(&log->misc);

if (unlikely(ret)) {

printk(KERN_ERR "logger: failed to register misc "

“device for log ‘%s’!\n”, log->misc.name);

return ret;

}

printk(KERN_INFO “logger: created %luK log ‘%s’\n”,

(unsigned long) log->size >> 10, log->misc.name);

return 0;

}

static int __init logger_init(void)

{

int ret;

ret = init_log(&log_main);

if (unlikely(ret))

goto out;

ret = init_log(&log_events);

if (unlikely(ret))

goto out;

ret = init_log(&log_radio);

if (unlikely(ret))

goto out;

ret = init_log(&log_system);

if (unlikely(ret))

goto out;

out:

return ret;

}

device_initcall(logger_init);

整个Logger驱动的入口点就是Logger_init(),它用init_log(struct logger_log *log)初始化了log_main, log_eve

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值