赞
踩
第一篇博客,讲的主要是c++,java中打印log,然后通过socket传给logd,然后logd是如何处理接受log的。
logcat -c
清除已有log信息
logcat -b main 显示主缓冲区的log
logcat -b radio 显示无线缓冲区的log
logcat -b events 显示事件缓冲区的log
logcat -f [filename] 将log保存到指定的文件中,例如logcat -b radio -f /data/radio.log
比较常用的是显示时间:logcat -v time &
logcat -g 查看缓冲区的大小
logcat -g main
logcat -g radio
logcat -g events
logcat打印/dev/log设备下的三个文件radio, events, main数据
logcat默认是输出main、system缓冲区的log
在Android的java层的log有几种,比如Log Slog Rlog
我们先来看看其实现:
Slog
Rlog
Log
最终都是调用了printIn_native只是id不同main,system,radio。
因为这里log库是公用的代码,host target都是也就是有的是pc代码,有的是手机代码共有了
上面的函数我们先调用了__write_to_log_initialize函数,然后再调用了__write_to_log_daemon函数
上面初始化,我们的socket是dev/socket/logdw,__write_to_log_daemon函数我们就不看了就是往socket写log,而用的就是log_fd这个fd。
往socket写之后,又会在哪里接受呢?
答案是logd
我们先看下logd的main函数
在logd的main函数中如下代码:
监听的socket为logdw,当有socket数据来的会调用onDataAvailable函数,这个函数我们就不看了,在这个函数中调用了LogBuffer::log函数。
这个函数主要讲log的内容信息封装在LogBufferElement,然后放到mLogElements中,最后调用maybePrune函数。
我们首先看下这个英文注释,如果某个id的log超过了最大值,要删除256或者log总数的10%。
我们再来看看log_buffer_size这个函数,这个函数是某个id的log最大数。
最后我们每个log id的最大值都是256k,超过的话就要调用prune删除对应id的log了。
最后我们可以通过设置系统属性persist.logd.size来设置每个log id的最大缓存值,或者persist.logd.size.radio设置每个id的最大缓存值。
步骤:
将手机连上电脑并且进入root
setproppersist.logd.size.radio 1024k
reboot 重启
另外可以用getprop | grep logd查看设置的属性是否生效
logcat -g 可以查看每个id 的缓存大小
当然这是通过属性的方法设置,我们还可以通过logcat的命令,logcat -G 10m是设置所有的id的大小,logcat -b radio -G 10m是设置radio的log的缓存大小
在logcat中有如下代码,处理设置缓存大小:
最终会设置到logd中去,在logcat中调用的是android_logger_set_log_size函数
最终会调用到到logd中的runCommand中:
最终也会调用到LogBuffer::setSize函数,只是写属性后是永久生效的。
原文地址: http://blog.csdn.net/kc58236582/article/details/51073489
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。