配套系列教学视频链接:
说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
本文重点介绍init进程在启动的时候使用的日志重定位技术,方便大家去理解init进程代码中关于日志重定向的逻辑。
一:介绍
Android系统init进程启动的时候,log子系统没有启动起来, 但是我们仍然可以可以使用logcat -b kernel看到init进程的日志, 这是怎么做到的呢?其实是通过日志重定向来完成的。在init进程中代码中,有如下:system/core/init/first_stage_init.cpp
SetStdioToDevNull(argv);
// Now that tmpfs is mounted on /dev and we have /dev/kmsg, we can actually
// talk to the outside world...
InitKernelLogging(argv);
LOG(INFO) << "init first stage started!";
意味着,如果我们需要在init进程中输出日志, 只需要调用 LOG(pri)即可。
二,LOG()实现逻辑
在init进程中一般使用LOG()或者PLOG()宏定义来构造一个std::ostringstream 字符串流,将需要打印的数据写入流中, 然后将io流重定向到内核日志buffer中去:
LOG(pri)<<”xxx” ;
// logging.h中声明,最终都是调用android::base::LogMessage(logging.cpp中实现)
#define LOG(severity) LOG_TO(DEFAULT, severity)
#define LOG_TO(dest, severity) \
LOGGING_PREAMBLE(severity) && LOG_STREAM_TO(dest, severity)
#define LOG_STREAM_TO(dest, severity) \

本文详细介绍了Android系统中init进程如何在日志子系统未启动时通过日志重定向技术输出日志。讲解了LOG()宏的实现逻辑,以及自定义日志重定向到内核的方法,并展示了init进程内部的日志重定向代码。文章最后总结了新旧版本Android系统中日志处理方式的差异和扩展性。
最低0.47元/天 解锁文章
282

被折叠的 条评论
为什么被折叠?



