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
最終寫到 “/dev/socket/logdw”中,此時(shí)logd中的LogListener會(huì)監(jiān)測(cè)到存在log信息需要寫入,待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文章
3936瀏覽量
127403 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68612 -
日志
+關(guān)注
關(guān)注
0文章
138瀏覽量
10642
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論