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, &