Android的log机制,flutter蓝牙打印

本文深入探讨了Android的log机制,包括isLoggable()的实现和println_native()的详细步骤,以及如何通过Logger驱动写入数据。此外,还提及了Flutter环境下如何进行蓝牙打印,提供了一个从底层到应用层的完整理解。
摘要由CSDN通过智能技术生成

isLoggable()的实现

isLoggable的实现是比较(来自参数)与当前property里设定的“log.tag.”(来自参数)的值,大于或等于都是可记录的。程序实现片断如下:

// LOG_NAMESPACE : “log.tag.”

// chars: convert from param

strncpy(key, LOG_NAMESPACE, sizeof(LOG_NAMESPACE)-1);

strcpy(key + sizeof(LOG_NAMESPACE) - 1, chars);

len = property_get(key, buf, “”);

int logLevel = toLevel(buf);

return (logLevel >= 0 && level >= logLevel) ? true : false;

println_native()的实现

函数android_util_Log_println_native() [文件android_util.Log.cpp中]调用了__android_log_buf_write()[文件system/core/liblog/logd_write.c中]。__android_log_buf_write()组织了参数,又调用了write_to_log这个函数指针。

write_to_log这个函数指针是实现的关键。

看write_to_log的定义:

static int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr);

static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init;

write_to_log初始是指向__write_to_log_init()这个函数的。所以第一次执行write_to_log的时候是执行了__write_to_log_init()。而如果write_to_log不是第一次被执行,它已经在__write_to_log_init()里被修改指向了__write_to_log_kernel()。

先看__write_to_log_init()的实现:

static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)

{

#ifdef HAVE_PTHREADS

pthread_mutex_lock(&log_init_lock);

#endif

if (write_to_log == __write_to_log_init) {

log_fds[LOG_ID_MAIN] = log_open("/dev/"LOGGER_LOG_MAIN, O_WRONLY);

log_fds[LOG_ID_RADIO] = log_open("/dev/"LOGGER_LOG_RADIO, O_WRONLY);

log_fds[LOG_ID_EVENTS] = log_open("/dev/"LOGGER_LOG_EVENTS, O_WRONLY);

log_fds[LOG_ID_SYSTEM] = log_open("/dev/"LOGGER_LOG_SYSTEM, O_WRONLY);

write_to_log = __write_to_log_kernel;

if (log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0 ||

log_fds[LOG_ID_EVENTS] < 0) {

log_close(log_fds[LOG_ID_MAIN]);

log_close(log_fds[LOG_ID_RADIO]);

log_close(log_fds[LOG_ID_EVENTS]);

log_fds[LOG_ID_MAIN] = -1;

log_fds[LOG_ID_RADIO] = -1;

log_fds[LOG_ID_EVENTS] = -1;

write_to_log = __write_to_log_null;

}

if (log_fds[LOG_ID_SYSTEM] < 0) {

log_fds[LOG_ID_SYSTEM] = log_fds[LOG_ID_MAIN];

}

}

#ifdef HAVE_PTHREADS

pthread_mutex_unlock(&log_init_lock);

#endif

return write_to_log(log_id, vec, nr);

}

基本上就是做互斥访问的保护,然后如果是第一次调用(write_to_log还指向__write_to_log_init()),就打开相应的设备文件,获取描述符,并把write_to_log指向__write_to_log_kernel()。再在_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值