android 日志方案研究

android Log原理

对于android工程师,可能对于Log底层jni部分细节不需要具体了解,用一张图来了解其实现流程:

Android_Log

这里涉及到三个进程:

APP进程:  调用Log的接口打日志,最终通过soctket通信发送给Logd进程

Logd进程:有一个缓冲区用于存储日志(环形缓冲区,当满时会冲掉旧的日志)

Logcat进程:可以在adb shell中创建(可以创建多个),查看缓冲区中日志的进程(Android Studio的logcat也是一个Logcat进程)。


环形缓冲区是一个逻辑上的循环队列,写者可以往里面写东西,而一旦有内容会通知等待队列里的读者们来读取内容,否则等待队列列处于阻塞状态。 这就意味Logcat进程读取也是阻塞形式的。


基于缓存的日志方案

对于普通应用:实现一套自己的Log,将每次打的日志缓存起来。

对于系统应用:在应用中开启一起Logcat进程,不断的读取Logd进程中的日志到缓存中,当日质量达到一定的阈值后再刷如文件。这种方案可以搜集到所有应用的日志。

缺点:

1. 写文件 + 加密  会出现cpu峰值

2. 崩溃或者进程意外退出 缓存中的日志可能无法刷到文件中,关键崩溃信息可能丢失。


对于智能设备中专门做一个日志进程去搜集所有应用的日志,这种方案其实是简单可行的。


基于共享内存的方案


基于mmp的方案


参考:

https://blog.csdn.net/tencent_bugly/article/details/53157830

http://ju.outofmemory.cn/entry/224106

相关文章
相关标签/搜索