Linux-4.19移植logcat
由于4.x内核去掉了logcat,所以只能从3.x内核移植相应的文件,本文讲述从3.4内核移植logcat到4.19内核的方法
- linux-3.4/drivers/staging/android目录下,复制logger.c和logger.h到linux-4.19驱动对应目录下,并做一些修改,才能编译通过
# diff linux-4.19/kernel/drivers/staging/android/logger.c linux-3.4/drivers/staging/android/logger.c
28,30d27
< #include <linux/sched/signal.h>
< #include <linux/cred.h>
< #include <linux/uio.h>
297c294
< reader->r_off, current_euid().val);
---
> reader->r_off, current_euid());
449c446,447
< ssize_t logger_aio_write(struct kiocb *iocb, struct iov_iter *iter)
---
> ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov,
> unsigned long nr_segs, loff_t ppos)
463,464c461,462
< header.euid = current_euid().val;
< header.len = min_t(size_t, iter->count, LOGGER_ENTRY_MAX_PAYLOAD);
---
> header.euid = current_euid();
> header.len = min_t(size_t, iocb->ki_left, LOGGER_ENTRY_MAX_PAYLOAD);
483c481
< while (iter->nr_segs-- > 0) {
---
> while (nr_segs-- > 0) {
488c486
< len = min_t(size_t, iter->iov->iov_len, header.len - ret);
---
> len = min_t(size_t, iov->iov_len, header.len - ret);
491c489
< nr = do_write_log_from_user(log, iter->iov->iov_base, len);
---
> nr = do_write_log_from_user(log, iov->iov_base, len);
498c496
< iter->iov++;
---
> iov++;
603c601
< reader->r_off, current_euid().val);
---
> reader->r_off, current_euid());
658c656
< reader->r_off, current_euid().val);
---
> reader->r_off, current_euid());
671c669
< if (!(in_egroup_p(file_inode(file)->i_gid) ||
---
> if (!(in_egroup_p(file->f_dentry->d_inode->i_gid) ||
707c705
< .write_iter = logger_aio_write,
---
> .aio_write = logger_aio_write,
- 修改驱动linux-4.19/kernel/drivers/staging/android/Makefile文件,增加对logger.c的编译,可以直接使能,不用宏定义
obj-y += logger.o
- 重新编译kernel,烧录到机器上启动,查看/dev/log,包含以下五个节点,代表logcat驱动移植成功
[root@Soky:~]# ls /dev/log
log log_events log_main log_radio log_system
-
步骤3确认了五个节点生成后,还需要应用编译logcat源码,可下拉相应的github项目: linux-logcat项目源码,自行完成编译。
-
步骤4生成相应的so和logcat进程,应用链接so,包含头文件include/android/log.h即可使用__android_log_print函数打印。
-
logcat -v time命令可实时打印日志
No pains, no gains.