Android系统10 RK3399 init进程启动(十九) init进程日志重定向至内核

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

配套系列教学视频链接:

      安卓系列教程之ROM系统开发-百问100ask

说明

系统: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)                                           \

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值