<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=android_log%E7%B3%BB%E7%BB%9F</id>
	<title>android log系统 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=android_log%E7%B3%BB%E7%BB%9F"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=android_log%E7%B3%BB%E7%BB%9F&amp;action=history"/>
	<updated>2026-09-01T05:26:50Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=android_log%E7%B3%BB%E7%BB%9F&amp;diff=850&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 12:08 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=android_log%E7%B3%BB%E7%BB%9F&amp;diff=850&amp;oldid=prev"/>
		<updated>2015-05-06T12:08:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= 使用选项简介 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Controlling Log Output Format&lt;br /&gt;
&lt;br /&gt;
Log messages contain a number of metadata fields, in addition to the tag and priority. You can modify the output format for messages so that they display a specific metadata field. To do so, you use the -v option and specify one of the supported output formats listed below.&lt;br /&gt;
&lt;br /&gt;
    brief — Display priority/tag and PID of the process issuing the message (the default format).&lt;br /&gt;
    process — Display PID only.&lt;br /&gt;
    tag — Display the priority/tag only.&lt;br /&gt;
    raw — Display the raw log message, with no other metadata fields.&lt;br /&gt;
    time — Display the date, invocation time, priority/tag, and PID of the process issuing the message.&lt;br /&gt;
    threadtime — Display the date, invocation time, priority, tag, and the PID and TID of the thread issuing the message.&lt;br /&gt;
    long — Display all metadata fields and separate messages with blank lines.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
如:adb logcat -v threadtime，可同时打印时间、PID和TID，详见 http://developer.android.com/tools/debugging/debugging-log.html&lt;br /&gt;
&lt;br /&gt;
= 实现方式剖析 =&lt;br /&gt;
&lt;br /&gt;
== 一、java接口 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;android.util.Log&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
public final class Log {&lt;br /&gt;
...&lt;br /&gt;
    public static final int VERBOSE = 2;&lt;br /&gt;
...&lt;br /&gt;
    public static int v(String tag, String msg) {&lt;br /&gt;
        return println_native(LOG_ID_MAIN, VERBOSE, tag, msg);&lt;br /&gt;
    }&lt;br /&gt;
...&lt;br /&gt;
    public static int v(String tag, String msg, Throwable tr) {&lt;br /&gt;
        return println_native(LOG_ID_MAIN, VERBOSE, tag, msg + &amp;#039;\n&amp;#039; + getStackTraceString(tr));&lt;br /&gt;
    }&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;android.util.Slog&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
public final class Slog {&lt;br /&gt;
...&lt;br /&gt;
    public static int v(String tag, String msg) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static int v(String tag, String msg, Throwable tr) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag,&lt;br /&gt;
                msg + &amp;#039;\n&amp;#039; + Log.getStackTraceString(tr));&lt;br /&gt;
    }&lt;br /&gt;
...&lt;br /&gt;
    public static int println(int priority, String tag, String msg) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_SYSTEM, priority, tag, msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;com.mediatek.xlog.Xlog&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
public final class Xlog {&lt;br /&gt;
    public static int v(String tag, String msg) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_MAIN, Log.VERBOSE, tag, msg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static int v(String tag, String msg, Throwable tr) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_MAIN, Log.VERBOSE, tag, msg + &amp;#039;\n&amp;#039; + Log.getStackTraceString(tr));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;com.mediatek.xlog.SXlog&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
public final class SXlog {&lt;br /&gt;
    public static int v(String tag, String msg) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static int v(String tag, String msg, Throwable tr) {&lt;br /&gt;
        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg + &amp;#039;\n&amp;#039; + Log.getStackTraceString(tr));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 二、jni接口 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/frameworks/base/core/jni/android_util_Log.cpp&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
namespace android {&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,&lt;br /&gt;
        jint bufID, jint priority, jstring tagObj, jstring msgObj)&lt;br /&gt;
{&lt;br /&gt;
    const char* tag = NULL;&lt;br /&gt;
    const char* msg = NULL;&lt;br /&gt;
&lt;br /&gt;
    if (msgObj == NULL) {&lt;br /&gt;
        jniThrowNullPointerException(env, &amp;quot;println needs a message&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bufID &amp;lt; 0 || bufID &amp;gt;= LOG_ID_MAX) {&lt;br /&gt;
        jniThrowNullPointerException(env, &amp;quot;bad bufID&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (tagObj != NULL)&lt;br /&gt;
        tag = env-&amp;gt;GetStringUTFChars(tagObj, NULL);&lt;br /&gt;
    msg = env-&amp;gt;GetStringUTFChars(msgObj, NULL);&lt;br /&gt;
&lt;br /&gt;
    int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);&lt;br /&gt;
&lt;br /&gt;
    if (tag != NULL)&lt;br /&gt;
        env-&amp;gt;ReleaseStringUTFChars(tagObj, tag);&lt;br /&gt;
    env-&amp;gt;ReleaseStringUTFChars(msgObj, msg);&lt;br /&gt;
&lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * JNI registration.&lt;br /&gt;
 */&lt;br /&gt;
static JNINativeMethod gMethods[] = {&lt;br /&gt;
    /* name, signature, funcPtr */&lt;br /&gt;
    { &amp;quot;isLoggable&amp;quot;,      &amp;quot;(Ljava/lang/String;I)Z&amp;quot;, (void*) android_util_Log_isLoggable },&lt;br /&gt;
    { &amp;quot;println_native&amp;quot;,  &amp;quot;(IILjava/lang/String;Ljava/lang/String;)I&amp;quot;, (void*) android_util_Log_println_native },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
}; // namespace android&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
println_native 等同于 android_util_Log_println_native.&lt;br /&gt;
== 三、hal ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/system/core/liblog/logd_write.c&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
首先来看 jni中 android_util_Log_println_native所调用的函数 __android_log_buf_write：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
int __android_log_buf_write(int bufID, int prio, const char *tag, const char *msg)&lt;br /&gt;
{&lt;br /&gt;
    struct iovec vec[3];&lt;br /&gt;
&lt;br /&gt;
    if (!tag)&lt;br /&gt;
        tag = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    /* XXX: This needs to go! */&lt;br /&gt;
    if (!strcmp(tag, &amp;quot;HTC_RIL&amp;quot;) ||&lt;br /&gt;
        !strncmp(tag, &amp;quot;RIL&amp;quot;, 3) || /* Any log tag with &amp;quot;RIL&amp;quot; as the prefix */&lt;br /&gt;
        !strcmp(tag, &amp;quot;AT&amp;quot;) ||&lt;br /&gt;
        !strcmp(tag, &amp;quot;GSM&amp;quot;) ||&lt;br /&gt;
        !strcmp(tag, &amp;quot;STK&amp;quot;) ||&lt;br /&gt;
        !strcmp(tag, &amp;quot;CDMA&amp;quot;) ||&lt;br /&gt;
        !strcmp(tag, &amp;quot;PHONE&amp;quot;) ||&lt;br /&gt;
        !strcmp(tag, &amp;quot;SMS&amp;quot;))&lt;br /&gt;
            bufID = LOG_ID_RADIO;&lt;br /&gt;
&lt;br /&gt;
    vec[0].iov_base   = (unsigned char *) &amp;amp;prio;&lt;br /&gt;
    vec[0].iov_len    = 1;&lt;br /&gt;
    vec[1].iov_base   = (void *) tag;&lt;br /&gt;
    vec[1].iov_len    = strlen(tag) + 1;&lt;br /&gt;
    vec[2].iov_base   = (void *) msg;&lt;br /&gt;
    vec[2].iov_len    = strlen(msg) + 1;&lt;br /&gt;
&lt;br /&gt;
    return write_to_log(bufID, vec, 3);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
此函数只是进行了传入参数的检验，并将 msg和 tag相关信息转存到了 vec[3]这个数组中，接着调用了函数 write_to_log，很容易发现 write_to_log其实是一个函数指针：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = __write_to_log_init;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
但在运行过程中，其指向函数会发生变化：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr)&lt;br /&gt;
{&lt;br /&gt;
#ifdef HAVE_PTHREADS&lt;br /&gt;
    pthread_mutex_lock(&amp;amp;log_init_lock);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    if (write_to_log == __write_to_log_init) {&lt;br /&gt;
        log_fds[LOG_ID_MAIN] = log_open(&amp;quot;/dev/&amp;quot;LOGGER_LOG_MAIN, O_WRONLY);&lt;br /&gt;
        log_fds[LOG_ID_RADIO] = log_open(&amp;quot;/dev/&amp;quot;LOGGER_LOG_RADIO, O_WRONLY);&lt;br /&gt;
        log_fds[LOG_ID_EVENTS] = log_open(&amp;quot;/dev/&amp;quot;LOGGER_LOG_EVENTS, O_WRONLY);&lt;br /&gt;
        log_fds[LOG_ID_SYSTEM] = log_open(&amp;quot;/dev/&amp;quot;LOGGER_LOG_SYSTEM, O_WRONLY);&lt;br /&gt;
&lt;br /&gt;
        write_to_log = __write_to_log_kernel;&lt;br /&gt;
&lt;br /&gt;
        if (log_fds[LOG_ID_MAIN] &amp;lt; 0 || log_fds[LOG_ID_RADIO] &amp;lt; 0 ||&lt;br /&gt;
                log_fds[LOG_ID_EVENTS] &amp;lt; 0) {&lt;br /&gt;
            log_close(log_fds[LOG_ID_MAIN]);&lt;br /&gt;
            log_close(log_fds[LOG_ID_RADIO]);&lt;br /&gt;
            log_close(log_fds[LOG_ID_EVENTS]);&lt;br /&gt;
            log_fds[LOG_ID_MAIN] = -1;&lt;br /&gt;
            log_fds[LOG_ID_RADIO] = -1;&lt;br /&gt;
            log_fds[LOG_ID_EVENTS] = -1;&lt;br /&gt;
            write_to_log = __write_to_log_null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (log_fds[LOG_ID_SYSTEM] &amp;lt; 0) {&lt;br /&gt;
            log_fds[LOG_ID_SYSTEM] = log_fds[LOG_ID_MAIN];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
#ifdef HAVE_PTHREADS&lt;br /&gt;
    pthread_mutex_unlock(&amp;amp;log_init_lock);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    return write_to_log(log_id, vec, nr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
即除了第一次调用Log系列函数时会通过 __write_to_log_init进行初始化外，后续的调用都会指向到 __write_to_log_kernel当中：&lt;br /&gt;
&amp;lt;pre class = &amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)&lt;br /&gt;
{&lt;br /&gt;
    ssize_t ret;&lt;br /&gt;
    int log_fd;&lt;br /&gt;
&lt;br /&gt;
    if (/*(int)log_id &amp;gt;= 0 &amp;amp;&amp;amp;*/ (int)log_id &amp;lt; (int)LOG_ID_MAX) {&lt;br /&gt;
        log_fd = log_fds[(int)log_id];&lt;br /&gt;
    } else {&lt;br /&gt;
        return EBADF;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    do {&lt;br /&gt;
        ret = log_writev(log_fd, vec, nr);&lt;br /&gt;
    } while (ret &amp;lt; 0 &amp;amp;&amp;amp; errno == EINTR);&lt;br /&gt;
&lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
log_writev则是一个宏：&lt;br /&gt;
&amp;lt;pre class = &amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#if FAKE_LOG_DEVICE&lt;br /&gt;
// This will be defined when building for the host.&lt;br /&gt;
#define log_open(pathname, flags) fakeLogOpen(pathname, flags)&lt;br /&gt;
#define log_writev(filedes, vector, count) fakeLogWritev(filedes, vector, count)&lt;br /&gt;
#define log_close(filedes) fakeLogClose(filedes)&lt;br /&gt;
#else&lt;br /&gt;
#define log_open(pathname, flags) open(pathname, flags)&lt;br /&gt;
#define log_writev(filedes, vector, count) writev(filedes, vector, count)&lt;br /&gt;
#define log_close(filedes) close(filedes)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
在android中指向 writev(filedes, vector, count)：&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;bionic/libc/arch-sh/syscalls/writev.S&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
/* autogenerated by gensyscalls.py */&lt;br /&gt;
#include &amp;lt;sys/linux-syscalls.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    .text&lt;br /&gt;
    .type writev, @function&lt;br /&gt;
    .globl writev&lt;br /&gt;
    .align 4&lt;br /&gt;
&lt;br /&gt;
writev:&lt;br /&gt;
&lt;br /&gt;
    /* invoke trap */&lt;br /&gt;
    mov.l   0f, r3  /* trap num */&lt;br /&gt;
    trapa   #(3 + 0x10)&lt;br /&gt;
&lt;br /&gt;
    /* check return value */&lt;br /&gt;
    cmp/pz  r0&lt;br /&gt;
    bt      __NR_writev_end&lt;br /&gt;
&lt;br /&gt;
    /* keep error number */&lt;br /&gt;
    sts.l   pr, @-r15&lt;br /&gt;
    mov.l   1f, r1&lt;br /&gt;
    jsr     @r1&lt;br /&gt;
    mov     r0, r4&lt;br /&gt;
    lds.l   @r15+, pr&lt;br /&gt;
&lt;br /&gt;
__NR_writev_end:&lt;br /&gt;
    rts&lt;br /&gt;
    nop&lt;br /&gt;
&lt;br /&gt;
    .align  2&lt;br /&gt;
0:  .long   __NR_writev&lt;br /&gt;
1:  .long   __set_syscall_errno&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
也就是说，log最终是写入到以下设备文件中的：&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/system/core/include/cutils/logger.h&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#define LOGGER_LOG_MAIN		&amp;quot;log/main&amp;quot;&lt;br /&gt;
#define LOGGER_LOG_RADIO	&amp;quot;log/radio&amp;quot;&lt;br /&gt;
#define LOGGER_LOG_EVENTS	&amp;quot;log/events&amp;quot;&lt;br /&gt;
#define LOGGER_LOG_SYSTEM	&amp;quot;log/system&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 四、Log驱动 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;kernel/drivers/staging/android/logger.h&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#define LOGGER_LOG_RADIO	&amp;quot;log_radio&amp;quot;	/* radio-related messages */&lt;br /&gt;
#define LOGGER_LOG_EVENTS	&amp;quot;log_events&amp;quot;	/* system/hardware events */&lt;br /&gt;
#define LOGGER_LOG_SYSTEM	&amp;quot;log_system&amp;quot;	/* system/framework messages */&lt;br /&gt;
#define LOGGER_LOG_MAIN		&amp;quot;log_main&amp;quot;	/* everything else */&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;kernel/drivers/staging/android/logger.c&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
static int __init logger_init(void)&lt;br /&gt;
{&lt;br /&gt;
	int ret;&lt;br /&gt;
&lt;br /&gt;
	ret = init_log(&amp;amp;log_main);&lt;br /&gt;
	if (unlikely(ret))&lt;br /&gt;
		goto out;&lt;br /&gt;
&lt;br /&gt;
	ret = init_log(&amp;amp;log_events);&lt;br /&gt;
	if (unlikely(ret))&lt;br /&gt;
		goto out;&lt;br /&gt;
&lt;br /&gt;
	ret = init_log(&amp;amp;log_radio);&lt;br /&gt;
	if (unlikely(ret))&lt;br /&gt;
		goto out;&lt;br /&gt;
&lt;br /&gt;
	ret = init_log(&amp;amp;log_system);&lt;br /&gt;
	if (unlikely(ret))&lt;br /&gt;
		goto out;&lt;br /&gt;
&lt;br /&gt;
	init_log_proc();&lt;br /&gt;
&lt;br /&gt;
out:&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 五、疑问 ==&lt;br /&gt;
&lt;br /&gt;
文件 kernel/drivers/staging/android/logger.h 中&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#define LOGGER_LOG_RADIO	&amp;quot;log_radio&amp;quot;	/* radio-related messages */&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
名字为何与实际 dev/ 文件夹下的 log/radio 不一致???&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>