<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                **struct logger_entry** **system/core/include/cutils/logger.h** ~~~ struct logger_entry { uint16_t len; /* length of the payload */ uint16_t __pad; /* no matter what, we get 2 bytes of padding */ int32_t pid; /* generating process's pid */ int32_t tid; /* generating process's tid */ int32_t sec; /* seconds since Epoch */ int32_t nsec; /* nanoseconds */ char msg[0]; /* the entry's payload */ }; #define LOGGER_ENTRY_MAX_LEN (4*1024) #define LOGGER_ENTRY_MAX_PAYLOAD \ (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry)) ~~~ 結構體logger_entry和宏LOGGER_ENTRY_MAX_LEN、LOGGER_ENTRY_MAX_PAYLOAD是從Logger日志驅動程序中提取出來的。在前面的4.2.1小節中,我們已經分析過它們的實現了。其中,結構體logger_entry用來描述一條日志記錄;宏LOGGER_ENTRY_MAX_LEN用來描述一條日志記錄的最大長度,包括日志記錄頭和日志記錄有效負載兩部分內容的長度;宏LOGGER_ENTRY_MAX_PAYLOAD用來描述日志記錄有效負載的最大長度。 **struct queued_entry_t** **system/core/logcat/logcat.cpp** ~~~ struct queued_entry_t { union { unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1] __attribute__((aligned(4))); struct logger_entry entry __attribute__((aligned(4))); }; queued_entry_t* next; queued_entry_t() { next = NULL; } }; ~~~ 結構體queued_entry_t用來描述一個日志記錄隊列。每一種類型的日志記錄都對應有一個日志記錄隊列。Logcat工具將相同類型的日志記錄按照寫入時間的先后順序保存在同一個隊列中,這樣在輸出日志記錄時,沿著這個隊列就可以按照時間順序來依次輸出系統中的日志信息了。結構體queued_entry_t的第一個成員變量是一個聯合體,用來描述一條日志記錄的內容。通過這個聯合體,Logcat工具就既可以把一條日志記錄內容當作一個緩沖區來處理,也可以把它當作一個logger_entry結構體來處理。結構體queued_entry_t的另外一個成員變量next用來連接下一條日志記錄,從而形成一個隊列。 **struct log_device_t** **system/core/logcat/logcat.cpp** ~~~ struct log_device_t { char* device; bool binary; int fd; bool printed; char label; queued_entry_t* queue; log_device_t* next; log_device_t(char* d, bool b, char l) { device = d; binary = b; label = l; queue = NULL; next = NULL; printed = false; } void enqueue(queued_entry_t* entry) { if (this->queue == NULL) { this->queue = entry; } else { queued_entry_t** e = &this->queue; while (*e && cmp(entry, *e) >= 0) { e = &((*e)->next); } entry->next = *e; *e = entry; } } }; ~~~ 結構體log_device_t用來描述一個日志設備。成員變量device保存的是日志設備文件名稱。我們知道,Logger日志驅動程序在初始化時,會創建四個設備文件/dev/log/main、/dev/log/system、/dev/log/radio和/dev/log/events,分別用來代表四個日志設備。成員變量label用來描述日志設備的標號,其中,日志設備/dev/log/main、/dev/log/system、/dev/log/radio和/dev/log/events對應的標號分別為‘m’、‘s’、‘r’和‘e’。成員變量binary是一個布爾值,表示日志記錄的內容是否是二進制格式的。我們知道,只有日志設備/dev/log/events的日志記錄內容才是二進制格式的,其余的日志設備的日志記錄內容均為文本格式的。成員變量fd是一個文件描述符,它是通過調用函數open來打開相應的日志設備文件得到的,用來從Logger日志驅動程序中讀取日志記錄。成員變量printed是一個布爾值,用來表示一個日志設備是否已經處于輸出狀態。成員變量queue用來保存日志設備中的日志記錄。成員變量next用來連接下一個日志設備,這樣,Logcat工具就可以把所有已經打開的日志設備保存在一個隊列中。 結構體log_device_t的成員函數enqueue用來將一條日志記錄添加到內部的日志記錄隊列中。每次往隊列中加入一條日志記錄時,都會根據它的寫入時間來找到它在隊列中的位置,然后再將它插入到隊列中。兩條日志記錄的寫入時間比較是通過調用函數cmp來實現的,它的定義如下所示。 **system/core/logcat/logcat.cpp** ~~~ static int cmp(queued_entry_t* a, queued_entry_t* b) { int n = a->entry.sec - b->entry.sec; if (n != 0) { return n; } return a->entry.nsec - b->entry.nsec; } ~~~ 它先比較日志寫入時間的秒數。如果相等,再比較日志寫入時間的毫秒數;否則,就可以得到比較結果。如果函數cmp的返回值大于0,就表示日志記錄a的寫入時間比日志記錄b晚;如果函數cmp的返回值等于0,就表示日志記錄a和b的寫入時間相等;如果函數cmp的返回值小于0,就表示日志記錄a的寫入時間比日志記錄b早。 **enum android_LogPriority** **system/core/include/android/log.h** ~~~ /* * Android log priority values, in ascending priority order. */ typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */ } android_LogPriority; ~~~ 枚舉android_LogPriority用來描述日志記錄的優先級,它一共有九個值,分別表示九個優先級。 **enum AndroidLogPrintFormat** **system/core/include/cutils/logprint.h** ~~~ typedef enum { FORMAT_OFF = 0, FORMAT_BRIEF, FORMAT_PROCESS, FORMAT_TAG, FORMAT_THREAD, FORMAT_RAW, FORMAT_TIME, FORMAT_THREADTIME, FORMAT_LONG, } AndroidLogPrintFormat; ~~~ 枚舉AndroidLogPrintFormat用來描述日志記錄的輸出格式,它一共有九個值,分別表示九種不同的輸出格式。在分析日志記錄的輸出過程時,我們再分析它們的含義。 **struct AndroidLogEntry_t** **system/core/include/cutils/logprint.h** ~~~ typedef struct AndroidLogEntry_t { time_t tv_sec; long tv_nsec; android_LogPriority priority; pid_t pid; pthread_t tid; const char * tag; size_t messageLen; const char * message; } AndroidLogEntry; ~~~ 與結構體logger_entry一樣,結構體AndroidLogEntry_t也是用來描述一條日志記錄的,不過,它描述的日志記錄是經過解析了的,即已經將它的優先級、標簽和內容都解析出來了,分別保存在成員變量priority、tag和message中。 **struct FilterInfo_t** **system/core/liblog/logprint.c** ~~~ typedef struct FilterInfo_t { char *mTag; android_LogPriority mPri; struct FilterInfo_t *p_next; } FilterInfo ~~~ 結構體FilterInfo_t用來描述一個日志記錄輸出過濾器。成員變量mTag和mPri分別表示要過濾的日志記錄的標簽和優先級。當一條日志記錄的標簽等于mTag時,如果它的優先級大于等于mPri,那么它就會被輸出,否則就會被忽略。成員變量p_next用來連接下一個日志記錄輸出過濾器,這樣就可以將所有的日志記錄輸出過濾器連接在一起形成一個隊列。 **struct AndroidLogFormat_t** **system/core/liblog/logprint.c** ~~~ struct AndroidLogFormat_t { android_LogPriority global_pri; FilterInfo *filters; AndroidLogPrintFormat format; }; ~~~ 結構體AndroidLogFormat_t用來保存日志記錄的輸出格式以及輸出過濾器。其中,成員變量global_pri是一個全局設置的默認日志記錄輸出過濾優先級,成員變量filters是一個日志記錄輸出過濾器列表,而成員變量format用來保存具體的日志記錄輸出格式。當日志記錄輸出過濾器列表filters中的某一個過濾器的過濾優先級被設置為默認優先級ANDROID_LOG_DEFAULT時,系統就會將它的過濾優先級修改為global_pri。 **struct EventTag** **system/core/liblog/event_tag_map.c** ~~~ typedef struct EventTag { unsigned int tagIndex; const char* tagStr; } EventTag; ~~~ 結構體EventTag用來描述類型為events的日志記錄的標簽號,每一個標簽號(tagIndex)都對應有一個文本描述字符串(tagStr)。這些對應關系是通過解析目標設備上的/system/etc/event-log-tags文件得到的。 **struct EventTagMap** **system/core/liblog/event_tag_map.c** ~~~ struct EventTagMap { /* memory-mapped source file; we get strings from here */ void* mapAddr; size_t mapLen; /* array of event tags, sorted numerically by tag index */ EventTag* tagArray; int numTags; }; ~~~ 結構體EventTagMap用來描述類型為events的日志記錄的內容格式,它同樣是通過解析目標設備上的/system/etc/event-log-tags文件得到的。Logcat工具在打開目標設備上的/system/etc/event-log-tags文件時,會把它的內容映射到內存中,其中,成員變量mapAddr就指向這塊內存的起始地址;成員變量mapLen表示該內存的大小;成員變量tagArray是一個EventTag類型的數組,數組的大小由成員變量numTags來描述。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看