安卓init进程没有打印,因为init的打印被重定向到/sys/fs/selinux/null。调试init时如果要开启打印,首先要解决打印重定向问题, 修改文件system/core/init/log.cpp,
@@ -25,6 +25,7 @@
void InitKernelLogging(char* argv[]) {
// Make stdin/stdout/stderr all point to /dev/null.
+#if 0
int fd = open("/sys/fs/selinux/null", O_RDWR);
if (fd == -1) {
int saved_errno = errno;
@@ -36,7 +37,7 @@ void InitKernelLogging(char* argv[]) {
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2) close(fd);
+#endif
修改完毕,虽然可以打印log,但是 log稍微一多,发现打印不全,部分打印被忽略了,因为Kernel中对打印的频率做了监控,再修改Kernel代码屏蔽此控制,修改文件linux-4.9.y/kernel/printk/printk.c
@@ -742,10 +742,12 @@ static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_it
er *from)
return len;
/* Ratelimit when not explicitly enabled. */
+#if 0
if (!(devkmsg_log & DEVKMSG_LOG_MASK_ON)) {
if (!___ratelimit(&user->rs, current->comm))
return ret;
}
+#endif
buf = kmalloc(len+1, GFP_KERNEL);
if (buf == NULL)
上述方法直接修改代码,比较暴力,不过有效;如有命令或什么参数可以解决,欢迎指教。
本文介绍了如何在安卓8.0系统中解决init进程打印被重定向的问题,通过修改`system/core/init/log.cpp`和`linux-4.9.y/kernel/printk/printk.c`两处代码来开启和优化init的log输出。尽管这种方法直接且有效,但作者也欢迎更优雅的解决方案。
2359

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



