2.2.3 Android日志与logd交互过程
2.2.3.1 Android日志传递给logd
Android app层或framework层,通过调用Log/Slog/Rlog中d方法打印日志,通过JNI会调用到native层android_util_Log_println_native接口,具体见下图内容。
接下来具体调用流程如下:
/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”中,此时logd中的LogListener会监测到存在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保存过程
具体代码路径如/XXX/system/logging/logd/main.cpp,从文件的main函数中可以看到,logd执行过程中创建了LogBuffer,LogReader,LogListener和CommandListener四个对象,上文有详细介绍,本节暂且不予解释,详情见2.3.1.2节内容。
接下来创建LogListener的对象,开启一个线程“logd.writer”监听数据,具体过程见下图。
HandleData()
-->logbuf_->Log
新建一个LogBufferElement对象,实现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命令参数解析在Run函数中执行。
android_logger_list_read接下来的调用过程如下:
android_logger_list_read
-->LogdRead //打开logdr,并通过socket获取log
-->logdOpen
logd的main函数中有开启LogReader监听
// 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监听到数据,则执行onDataAvailable函数进行处理。
最后加入read_list_中:
最终通过ProcessBuffer输出日志内容,打印log_msg日志到界面或者fd文件中。具体内容包括:处理日志buffer内容、回滚打印日志内容等。
-
Android
+关注
关注
12文章
3935浏览量
127339 -
代码
+关注
关注
30文章
4779浏览量
68521 -
日志
+关注
关注
0文章
138浏览量
10639
发布评论请先 登录
相关推荐
评论