2.2.3 Android日志與logd交互過(guò)程
2.2.3.1 Android日志傳遞給logd
Android app層或framework層,通過(guò)調(diào)用Log/Slog/Rlog中d方法打印日志,通過(guò)JNI會(huì)調(diào)用到native層android_util_Log_println_native接口,具體見(jiàn)下圖內(nèi)容。
接下來(lái)具體調(diào)用流程如下:
/XXX/system/logging/liblog/logger_write.cpp
__android_log_buf_write
-->__android_log_write_log_message
-- >get_logger_function()
-- >__android_log_logd_logger
-- >write_to_log
-- >LogdWrite
最終寫(xiě)到 “/dev/socket/logdw”中,此時(shí)logd中的LogListener會(huì)監(jiān)測(cè)到存在log信息需要寫(xiě)入,待log保存到buffer中后,再通知LogReader將新保存的log傳遞給logcat等
socket信息如下
// Note that it is safe to call connect() multiple times on DGRAM Unix domain sockets, so this
// function is used to reconnect to logd without requiring a new socket.
static void LogdConnect(int sock) {
sockaddr_un un = {};
un.sun_family = AF_UNIX;
strcpy(un.sun_path, "/dev/socket/logdw");
TEMP_FAILURE_RETRY(connect(sock, reinterpret_cast(&un), sizeof(sockaddr_un)));
}
2.2.3.2 logd中的log保存過(guò)程
具體代碼路徑如/XXX/system/logging/logd/main.cpp,從文件的main函數(shù)中可以看到,logd執(zhí)行過(guò)程中創(chuàng)建了LogBuffer,LogReader,LogListener和CommandListener四個(gè)對(duì)象,上文有詳細(xì)介紹,本節(jié)暫且不予解釋,詳情見(jiàn)2.3.1.2節(jié)內(nèi)容。
接下來(lái)創(chuàng)建LogListener的對(duì)象,開(kāi)啟一個(gè)線程“l(fā)ogd.writer”監(jiān)聽(tīng)數(shù)據(jù),具體過(guò)程見(jiàn)下圖。
HandleData()
-->logbuf_->Log
新建一個(gè)LogBufferElement對(duì)象,實(shí)現(xiàn)log的保存.
2.2.3.3 logcat獲取logd日志
/XXX/system/logging/logcat/logcat.cpp
int main(int argc, char** argv) {
Logcat logcat;
return logcat.Run(argc, argv);
}
具體的logcat命令參數(shù)解析在Run函數(shù)中執(zhí)行。
android_logger_list_read接下來(lái)的調(diào)用過(guò)程如下:
android_logger_list_read
-->LogdRead //打開(kāi)logdr,并通過(guò)socket獲取log
-->logdOpen
logd的main函數(shù)中有開(kāi)啟LogReader監(jiān)聽(tīng)
// LogReader listens on /dev/socket/logdr. When a client
// connects, log entries in the LogBuffer are written to the client.
LogReader* reader = new LogReader(log_buffer, &reader_list);
if (reader->startListener()) {
return EXIT_FAILURE;
}
LogReader繼承自SocketListener,如果socket監(jiān)聽(tīng)到數(shù)據(jù),則執(zhí)行onDataAvailable函數(shù)進(jìn)行處理。
最后加入read_list_中:
最終通過(guò)ProcessBuffer輸出日志內(nèi)容,打印log_msg日志到界面或者fd文件中。具體內(nèi)容包括:處理日志buffer內(nèi)容、回滾打印日志內(nèi)容等。
-
Android
+關(guān)注
關(guān)注
12文章
3973瀏覽量
130217 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70697 -
日志
+關(guān)注
關(guān)注
0文章
144瀏覽量
10864
發(fā)布評(píng)論請(qǐng)先 登錄
Android交互視覺(jué)設(shè)計(jì)
對(duì)于大規(guī)模系統(tǒng)日志的日志模式提煉算法的優(yōu)化

Android系統(tǒng)的日志模式選擇機(jī)制

工業(yè)智能網(wǎng)關(guān)日志有哪些?如何輸出和導(dǎo)出網(wǎng)關(guān)日志查看呢?

Android校園應(yīng)用開(kāi)發(fā)過(guò)程

日志設(shè)計(jì)開(kāi)發(fā)過(guò)程中的常見(jiàn)問(wèn)題

Android開(kāi)發(fā)中的日志接口介紹

logd守護(hù)進(jìn)程整體設(shè)計(jì)架構(gòu)

logd的啟動(dòng)過(guò)程和內(nèi)容

kernel日志寫(xiě)入logd介紹

logcat命令抓取日志方法

Android開(kāi)發(fā)中如何解決典型場(chǎng)景缺通用日志的問(wèn)題

奇怪!應(yīng)用的日志呢??

日志篇:模組日志總體介紹

評(píng)論