一、libc中日志输出讨论
安卓源码libc中,默认提供了日志调试输出接口。源码位于如下:
//头文件定义
bionic/libc/async_safe/include/async_safe/log.h
//实现文件
bionic/libc/async_safe/async_safe_log.cpp
通过async_safe_log.cpp代码分析,写入日志主要是使用UNIX domain socket建立到域"/dev/socket/logdw"的通信,然后写入日志数据。核心逻辑代码如下:
//正在写入日志的方法,主要调用open_log_socket建立socket连接,然后写数据进去
int async_safe_write_log(int priority, const char* tag, const char* msg) {
int main_log_fd = open_log_socket();
if (main_log_fd == -1) {
// Try stderr instead.
return write_stderr(tag, msg);
}
iovec vec[6];
char log_id = (priority == ANDROID_LOG_FATAL) ? LOG_ID_CRASH : LOG_ID_MAIN;
vec[0].iov_base = &log_id;
vec[0].iov_len = sizeof(log_id);
uint16_t tid = gettid();
vec[1].iov_base = &tid;
vec[1].iov_len = sizeof(tid);
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
log_time realtime_ts;
realtime_ts.tv_s