Android logcat 添加kernel log 并保存到本地

本文介绍了如何在Android设备上将kernel日志添加到logcat并保存到本地,这对于系统工程师排查死机和重启问题至关重要。文章探讨了两种思路,包括尝试移植MTK logger和修改logcat源码添加新参数。最终通过修改logcat源码,添加 `-a` 参数来同时记录kernel和系统日志,并在init.rc中配置开机启动服务,实现自动保存日志到本地。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android logcat 添加kernel log 并保存到本地

 

概述:作为一个Android系统工程师,最头疼的莫过于死机和重启,这种概率性Bug,往往在办公室的测试环境下很难复现,但是在实际使用中,确实会出现死机和重启,这时候有一份可靠的log,是尤其重要的,那么除了分析Android系统log,如果还能有一份kernel log是不是就更容易定位问题呢?

 

我们最常用的平台,有高通,MTK,RK,……,除了MTK有一个mtklog,其他的平台好像都没有内置这种打印log的应用,所以有时候就需要自己动手丰衣足食。

 

思路1.将MTK logger移植过去,然后开始了代码阅读,结果发现里面涉及的东西太多,逻辑还挺复杂,没有10天半个月,我很难搞清楚,故放弃(也怪自己太懒,抱拳),如果有哪位同学比较精通这个,希望能分享一下,多谢!!

 

思路2.logcat添加个参数,去打印kernel log,然后开机自启一个进程,去打印log并保存本地,貌似这个方案更简单一点,说干就干,开始实现功能。

 

Android源码/system/core/logcat/

预览一下目录:

相对来说工程比较小了,经过一番百度,我发现使用klogctl来保存kernel log是比较靠谱的,那么写一个函数:


 

static void processKernel(int op)

{

char *buffer;

char *p;

int n, klog_buf_len;

//新建一个文件

const char *fileName = getLogFileNeme(0);



FILE *fp = fopen(fileName, "wa");

if (fp == NULL)

{

fprintf(stderr, "BorrieGuo processKernel Eric Open File Failed!!!\n");

return;

}

//获取kernel log缓存大小

klog_buf_len = klogctl(KLOG_SIZE_BUFFER, 0, 0);



if (klog_buf_len <= 0)

{

klog_buf_len = FALLBACK_KLOG_BUF_LEN;

}

//申请一个buffer

buffer = (char *)malloc(klog_buf_len + 1);



if (!buffer)

{

fprintf(stderr, "BorrieGuo processKernel malloc ERROR\n");

return;

}



p = buffer;

//设置kernel log模式

if (op == KLOG_READ_CLEAR)

{

//获取全部log后并清除缓存

op = KLOG_READ_CLEAR;

}

else

{

//获取全部log

op = KLOG_READ_ALL;

}



//获取log

n = klogctl(op, buffer, klog_buf_len);

if (n <= 0)

{

fprintf(stderr, "BorrieGuo processKernel klogctl ERROR\n");

if (!remove(fileName))

{

fprintf(stderr, &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值