android Log原理
對於android工程師,可能對於Log底層jni部分細節不需要具體瞭解,用一張圖來了解其實現流程:
這裏涉及到三個進程:
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