__android_log_write_log_message -- >get_logger_function() -- >__android_log_logd_logger -- >write_to_log -- >LogdWrite 最終寫到 “/dev/socket/logdw”中,此時(shí)logd中的LogListener會(huì)監(jiān)測(cè)到存在log信息需要寫入,待log保存到" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Android日志與logd交互過(guò)程

麥辣雞腿堡 ? 來(lái)源:OPPO內(nèi)核工匠 ? 作者:marc ? 2023-11-23 17:06 ? 次閱讀

2.2.3 Android日志與logd交互過(guò)程

2.2.3.1 Android日志傳遞給logd

Android app層或framework層,通過(guò)調(diào)用Log/Slog/Rlog中d方法打印日志,通過(guò)JNI會(huì)調(diào)用到native層android_util_Log_println_native接口,具體見(jiàn)下圖內(nèi)容。

圖片

接下來(lái)具體調(diào)用流程如下:

/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”中,此時(shí)logd中的LogListener會(huì)監(jiān)測(cè)到存在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保存過(guò)程

具體代碼路徑如/XXX/system/logging/logd/main.cpp,從文件的main函數(shù)中可以看到,logd執(zhí)行過(guò)程中創(chuàng)建了LogBuffer,LogReader,LogListener和CommandListener四個(gè)對(duì)象,上文有詳細(xì)介紹,本節(jié)暫且不予解釋,詳情見(jiàn)2.3.1.2節(jié)內(nèi)容。

圖片

接下來(lái)創(chuàng)建LogListener的對(duì)象,開(kāi)啟一個(gè)線程“l(fā)ogd.writer”監(jiān)聽(tīng)數(shù)據(jù),具體過(guò)程見(jiàn)下圖。

圖片

HandleData()

-->logbuf_->Log

新建一個(gè)LogBufferElement對(duì)象,實(shí)現(xiàn)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命令參數(shù)解析在Run函數(shù)中執(zhí)行。

圖片

圖片

android_logger_list_read接下來(lái)的調(diào)用過(guò)程如下:

android_logger_list_read

-->LogdRead //打開(kāi)logdr,并通過(guò)socket獲取log

-->logdOpen

圖片

logd的main函數(shù)中有開(kāi)啟LogReader監(jiān)聽(tīng)

// 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監(jiān)聽(tīng)到數(shù)據(jù),則執(zhí)行onDataAvailable函數(shù)進(jìn)行處理。

圖片

圖片

圖片

最后加入read_list_中:

圖片

最終通過(guò)ProcessBuffer輸出日志內(nèi)容,打印log_msg日志到界面或者fd文件中。具體內(nèi)容包括:處理日志buffer內(nèi)容、回滾打印日志內(nèi)容等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3936

    瀏覽量

    127403
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68612
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    10642
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Android交互視覺(jué)設(shè)計(jì)

    Android交互視覺(jué)設(shè)計(jì)規(guī)范由Android UI組完成,其中涵蓋了Android交互和視覺(jué)兩個(gè)部分設(shè)計(jì)規(guī)范。
    發(fā)表于 09-15 10:25 ?0次下載

    對(duì)于大規(guī)模系統(tǒng)日志日志模式提煉算法的優(yōu)化

    LARGE框架是部署在中國(guó)科學(xué)院超級(jí)計(jì)算環(huán)境中的日志分析系統(tǒng),通過(guò)日志收集、集中分析、結(jié)果反饋等步驟對(duì)環(huán)境中的各種日志文件進(jìn)行監(jiān)控和分析。在對(duì)環(huán)境中系統(tǒng)日志的監(jiān)控
    發(fā)表于 11-21 14:54 ?7次下載
    對(duì)于大規(guī)模系統(tǒng)<b class='flag-5'>日志</b>的<b class='flag-5'>日志</b>模式提煉算法的優(yōu)化

    Android系統(tǒng)的日志模式選擇機(jī)制

    在寫磁盤的過(guò)程中如果意外掉電或系統(tǒng)崩潰很有可能導(dǎo)致文件系統(tǒng)中用戶數(shù)據(jù)和元數(shù)據(jù)不一致,現(xiàn)有文件系統(tǒng)主要采取寫前日志或?qū)憰r(shí)拷貝等一致性技術(shù)來(lái)解決該問(wèn)題,但均沒(méi)有考慮目錄對(duì)可靠性需求的差異性。針對(duì)現(xiàn)有
    發(fā)表于 01-03 14:46 ?0次下載
    <b class='flag-5'>Android</b>系統(tǒng)的<b class='flag-5'>日志</b>模式選擇機(jī)制

    工業(yè)智能網(wǎng)關(guān)日志有哪些?如何輸出和導(dǎo)出網(wǎng)關(guān)日志查看呢?

    日志主要看網(wǎng)關(guān)與平臺(tái)交互情況,判斷平臺(tái)數(shù)據(jù)是否正常,通道是否正常系統(tǒng)日志主要用于判斷網(wǎng)站和系統(tǒng)的異常如何輸出和導(dǎo)出工業(yè)智能網(wǎng)關(guān)的日志呢?1、采集日志
    的頭像 發(fā)表于 10-26 17:33 ?763次閱讀
    工業(yè)智能網(wǎng)關(guān)<b class='flag-5'>日志</b>有哪些?如何輸出和導(dǎo)出網(wǎng)關(guān)<b class='flag-5'>日志</b>查看呢?

    Android異常日志快速定位分析小技巧

    Android異常日志快速定位分析小技巧
    的頭像 發(fā)表于 08-09 10:06 ?2827次閱讀
    <b class='flag-5'>Android</b>異常<b class='flag-5'>日志</b>快速定位分析小技巧

    Android校園應(yīng)用開(kāi)發(fā)過(guò)程

    電子發(fā)燒友網(wǎng)站提供《Android校園應(yīng)用開(kāi)發(fā)過(guò)程.pdf》資料免費(fèi)下載
    發(fā)表于 10-19 11:36 ?0次下載
    <b class='flag-5'>Android</b>校園應(yīng)用開(kāi)發(fā)<b class='flag-5'>過(guò)程</b>

    日志設(shè)計(jì)開(kāi)發(fā)過(guò)程中的常見(jiàn)問(wèn)題

    日志是系統(tǒng)中熵增最快的一個(gè)模塊,它承載了業(yè)務(wù)野蠻生長(zhǎng)過(guò)程中的所有副產(chǎn)品。本文介紹了一個(gè)日志治理案例,圍繞降本和提效兩大主題,取得一定成效,分享給所有渴望造物樂(lè)趣的同學(xué)。
    的頭像 發(fā)表于 10-19 17:01 ?564次閱讀
    <b class='flag-5'>日志</b>設(shè)計(jì)開(kāi)發(fā)<b class='flag-5'>過(guò)程</b>中的常見(jiàn)問(wèn)題

    Android開(kāi)發(fā)中的日志接口介紹

    、LOG_ID_RADIO、LOG_ID_EVENTS、LOG_ID_SYSTEM、 LOG_ID_CRASH。 1.1.1 日志緩沖區(qū)簡(jiǎn)介 Android日志記錄系統(tǒng)守護(hù)進(jìn)程logd
    的頭像 發(fā)表于 11-23 16:27 ?1108次閱讀
    <b class='flag-5'>Android</b>開(kāi)發(fā)中的<b class='flag-5'>日志</b>接口介紹

    logd守護(hù)進(jìn)程整體設(shè)計(jì)架構(gòu)

    2.1 整體設(shè)計(jì)架構(gòu) 2.1.1 logd架構(gòu)設(shè)計(jì)圖 架構(gòu)設(shè)計(jì)圖內(nèi)容簡(jiǎn)介如下: logd啟動(dòng)過(guò)程還存在其他內(nèi)容,比如LogStatistics :是日志統(tǒng)計(jì)模塊,默認(rèn)開(kāi)啟統(tǒng)計(jì)數(shù)據(jù)較少,
    的頭像 發(fā)表于 11-23 16:31 ?565次閱讀
    <b class='flag-5'>logd</b>守護(hù)進(jìn)程整體設(shè)計(jì)架構(gòu)

    logd的啟動(dòng)過(guò)程和內(nèi)容

    logd作為native service,系統(tǒng)啟動(dòng)過(guò)程通過(guò)讀取rc文件來(lái)啟動(dòng),相關(guān)的屬性定義在如下logd.rc文件中。 2.2.1 logd啟動(dòng)過(guò)
    的頭像 發(fā)表于 11-23 16:54 ?867次閱讀
    <b class='flag-5'>logd</b>的啟動(dòng)<b class='flag-5'>過(guò)程</b>和內(nèi)容

    kernel日志寫入logd介紹

    kernel日志寫入logd介紹 通過(guò)logcat命令獲取kernel日志比較特殊,故作為一個(gè)例子進(jìn)行梳理。 2.3.1 整體流程 2.3.2 命令打印kernel日志 通過(guò)logca
    的頭像 發(fā)表于 11-23 17:11 ?722次閱讀
    kernel<b class='flag-5'>日志</b>寫入<b class='flag-5'>logd</b>介紹

    logcat命令抓取日志方法

    命令抓取日志 logcat -b main -b system -b crash -r 1024 -n 5 -f android.log -v threadtime -b:加載可供查看的緩沖區(qū)的日志
    的頭像 發(fā)表于 11-23 17:31 ?1194次閱讀
    logcat命令抓取<b class='flag-5'>日志</b>方法

    Android開(kāi)發(fā)中如何解決典型場(chǎng)景缺通用日志的問(wèn)題

    下面針對(duì)一些典型場(chǎng)景缺通用日志android/kernel)的問(wèn)題,一一列舉如下,希望可以讓大家關(guān)注到缺日志的真實(shí)原因。如下問(wèn)題也提醒各位工程師:謹(jǐn)慎添加日志,不要隨意添加,否則即容
    的頭像 發(fā)表于 11-23 17:39 ?938次閱讀
    <b class='flag-5'>Android</b>開(kāi)發(fā)中如何解決典型場(chǎng)景缺通用<b class='flag-5'>日志</b>的問(wèn)題

    奇怪!應(yīng)用的日志呢??

    1. 問(wèn)題回顧 問(wèn)題背景 是在進(jìn)行中臺(tái)應(yīng)用中間件遷移過(guò)程中,發(fā)現(xiàn)存在 項(xiàng)目啟動(dòng)失敗 或者 項(xiàng)目正常啟動(dòng) (jsf正常掛載并正常運(yùn)行,mq正常發(fā)送和消費(fèi))但是 無(wú)任何日志打印 現(xiàn)象。 更奇怪 的是不打
    的頭像 發(fā)表于 06-11 10:48 ?318次閱讀
    奇怪!應(yīng)用的<b class='flag-5'>日志</b>呢??

    日志篇:模組日志總體介紹

    ?今天我們學(xué)習(xí)合宙模組日志總體介紹,以下進(jìn)入正文。 一、本文討論的邊界 本文是對(duì)合宙 4G 模組, 以及 4G+GNSS 模組的日志功能的總體介紹。通過(guò)日志,可以對(duì)研發(fā)過(guò)程中,以及模組
    的頭像 發(fā)表于 10-24 07:16 ?196次閱讀
    <b class='flag-5'>日志</b>篇:模組<b class='flag-5'>日志</b>總體介紹