日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android日志[进阶篇]一-使用 Logcat 写入和查看日志

發布時間:2025/3/12 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android日志[进阶篇]一-使用 Logcat 写入和查看日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android日志[進階篇]一-使用 Logcat 寫入和查看日志
Android日志[進階篇]二-分析堆棧軌跡(調試和外部堆棧)
Android日志[進階篇]三-Logcat命令行工具
Android日志[進階篇]四-獲取錯誤報告
Android日志[進階篇]五-閱讀錯誤報告

目錄

    • 查看應用日志
    • 寫入日志消息
    • Logcat 消息格式
    • 設置日志級別
    • 搜索 logcat 消息
    • 過濾 logcat 消息
    • 讀取垃圾回收消息
      • Dalvik 日志消息
      • ART 日志消息

Android Studio 中的 Logcat 窗口會顯示系統消息,例如在進行垃圾回收時顯示的消息,以及使用 Log類添加到應用的消息。此窗口可以實時顯示消息,也可以保留歷史記錄,因此可以查看較早的消息。

要僅顯示感興趣的信息,可以創建過濾器、修改消息中顯示的信息量、設置優先級、僅顯示通過應用代碼生成的消息以及搜索日志。默認情況下,logcat 僅顯示與最近運行的應用相關的日志輸出。

如果應用拋出異常,logcat 會顯示一條消息,后跟相關聯的堆棧軌跡,其中包含指向相應代碼行的鏈接。

從 Android Studio 2.2 開始,Run 窗口還會顯示當前正在運行的應用的日志消息。請注意,可以配置 logcat 輸出顯示,但無法配置 Run 窗口。

查看應用日志

如需顯示應用的日志消息,請執行以下操作:

  • 在設備上構建和運行應用。
  • 依次點擊 View > Tool Windows > Logcat(或點擊工具窗口欄中的 Logcat 圖標 )。
  • Logcat 窗口會顯示所選應用(從窗口頂部的下拉列表中選擇)的日志消息,如圖 1 所示。

    圖 1. Logcat 窗口

    默認情況下,Logcat 僅顯示在設備上運行的應用的日志消息。要更改此默認設置,請參閱如何過濾 logcat 消息。

    Logcat 工具欄中提供的按鈕(如圖1標號):

  • Clear logcat :點擊此按鈕可以清除顯示的日志。
  • Scroll to the end :點擊此按鈕可以跳轉到日志底部并查看最新的日志消息。如果先點擊此按鈕,然后點擊日志中的某一行,則視圖會在相應位置暫停滾動。
  • Up the stack trace 和 Down the stack trace :點擊相應按鈕可以在日志的堆棧軌跡中進行上下導航,從而選擇輸出的異常中顯示的后續文件名(以及在編輯器中查看相應行號)。這與日志中點擊某個文件名時的行為相同。
  • Use soft wraps :點擊此按鈕可以啟用換行并防止水平滾動(盡管所有非間斷字符串仍然需要進行水平滾動)。
  • Print :點擊此按鈕可以輸出 logcat 消息。在顯示的對話框中選擇輸出偏好設置后,還可以選擇將其保存為 PDF 格式。
  • Restart :點擊此按鈕可以清除日志并重啟 logcat。與 Clear logcat 按鈕不同,此按鈕可以恢復并顯示之前的日志消息,因此當 Logcat 無響應而又不想失去日志消息時,此按鈕是最有用的。
  • Logcat header :點擊此按鈕可以打開 Configure Logcat Header 對話框,在該對話框中,可以自定義各個 Logcat 消息的外觀,例如是否顯示日期和時間。
  • Screen capture :點擊此按鈕可以截取屏幕截圖。
  • Screen record :點擊此按鈕可以錄制設備屏幕的視頻(時長不超過 3 分鐘)。
  • 寫入日志消息

    通過 Log 類,可以創建(輸出)日志消息,這些消息會顯示在 logcat 中。一般來說,使用以下日志方法,這些方法按照優先級從高到低(或者從最簡略到最詳細)的順序列示:

    • Log.e(String, String)(錯誤)
    • Log.w(String, String)(警告)
    • Log.i(String, String)(信息)
    • Log.d(String, String)(調試)
    • Log.v(String, String)(詳細)

    有關更完整的選項列表,請參閱 Log 類說明。

    除開發期間外,其他任何時候都絕不應將詳細日志編譯到您的應用中。雖然會編譯調試日志,但會在運行時將其去掉,而錯誤、警告和信息日志會始終保留。

    對于每種日志方法,第一個參數都應是唯一標記,第二個參數都應是消息。系統日志消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如 ActivityManager)。標記可以是有用的任何字符串,例如當前類的名稱。

    一種比較好的做法是,在要用于第一個參數的類中聲明 TAG 常量。例如,可以按如下方式創建一條信息日志消息:

    private static final String TAG = "MyActivity"; ... Log.i(TAG, "MyClass.getView() — get item number " + position);

    注意:長度超過 23 個字符的標記名稱在 logcat 輸出中會被截斷。

    Logcat 消息格式

    每個 Android 日志消息都有一個與之相關聯的標記和優先級。系統日志消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如 ActivityManager)。用戶定義的標記可以是任何字符串,例如當前類的名稱(建議的標記)。可以在 Log 方法調用中定義它,例如:

    Log.d(tag, message)

    優先級低到高:

    • V:詳細(優先級最低)
    • D:調試
    • I:信息
    • W:警告
    • E:錯誤
    • A:斷言

    日志消息的格式為:

    date time PID-TID/package priority/tag: message

    例如,下面的日志消息的優先級為 V,標記為 Eagle:

    12-10 13:02:50.071 1901-4229/com.eagle.app V/Eagle: Handling delegate intent.

    PID 代表進程標識符,TID 則為線程標識符;如果僅有一個線程,兩者可以相同。

    設置日志級別

    可以通過設置日志級別來控制 logcat 中顯示的消息數量。可以顯示所有消息,也可以僅顯示指示最嚴重情況的消息。

    請注意,無論日志級別設置如何,logcat 都會繼續收集所有消息。此設置僅決定 logcat 顯示什么。

    在“Log level”菜單中,選擇以下值之一:

    • Verbose:顯示所有日志消息(默認值)。
    • Debug:顯示僅在開發期間有用的調試日志消息,以及此列表中較低的消息級別。
    • Info:顯示常規使用情況的預期日志消息,以及此列表中較低的消息級別。
    • Warn:顯示尚不是錯誤的潛在問題,以及此列表中較低的消息級別。
    • Error:顯示已經引發錯誤的問題,以及此列表中較低的消息級別。
    • Assert:顯示開發者預計絕不會發生的問題。

    搜索 logcat 消息

    要搜索 logcat 中當前顯示的消息,請執行以下操作:

  • (可選)如果想要使用正則表達式搜索模式,請選擇 Regex
  • 在搜索框中輸入字符序列。

    Logcat 輸出會相應地顯示更改。

  • 按 Enter 鍵以在此會話期間將搜索字符串保存到菜單中。
  • 要重復搜索,請從搜索菜單中選擇。根據需要選擇或取消選擇 Regex(不建議使用此設置)。
  • 過濾 logcat 消息

    將日志輸出減少至可管理水平的一種方法是,使用過濾器施加限制。

    注意:過濾器會應用于 logcat 的全部歷史記錄,而不僅僅是 logcat 中當前顯示的消息。確保適當地設置其他顯示選項,以便能夠看到想要檢查的過濾器輸出。

    要定義并應用過濾器,請執行以下操作:

  • 在過濾器菜單中,選擇一個過濾選項:
    • Show only selected application:僅顯示通過應用代碼生成的消息(默認選項)。Logcat 使用正在運行的應用的 PID 來過濾日志消息。
    • No Filters:不應用過濾器。無論選擇哪個進程,logcat 都會顯示設備中的所有日志消息。
    • Edit Filter Configuration:創建或修改自定義過濾器。例如,創建一個過濾器,以同時查看兩個應用中的日志消息。
    定義過濾器后,可以在菜單中選擇它們。要從菜單中移除過濾器,刪除即可。
  • 如果選擇了 Edit Filter Configuration,請創建或修改過濾器:
  • 在“Create New Logcat Filter”對話框中指定過濾器參數:
    • Filter Name:輸入要設定的過濾器的名稱,或者從左側窗格中進行選擇以修改現有過濾器。名稱只能包含小寫字符、下劃線和數字。
    • Log Tag:(可選)指定標記。如需了解詳情,請參閱 Logcat 消息格式。
    • Log Message:(可選)指定日志消息文本。如需了解詳情,請參閱 Logcat 消息格式。
    • Package Name:(可選)指定軟件包名稱。如需了解詳情,請參閱 Logcat 消息格式。
    • PID:(可選)指定進程 ID。如需了解詳情,請參閱 Logcat 消息格式>。
    • Log Level:(可選)選擇日志級別。如需了解詳情,請參閱設置日志級別。
    • Regex:選擇此選項可以為相應參數使用正則表達式語法。
  • 點擊 +,將過濾器定義添加到左側窗格中。

    要移除過濾器,請在左側窗格中將其選中,然后點擊 -

  • 完成后,點擊 OK
  • 如果沒有看到想要檢查的日志消息,請嘗試選擇 No filters再clean一下日志, 并搜索特定日志消息。

    讀取垃圾回收消息

    有時,發生垃圾回收事件時,相應消息會輸出到 Logcat 中。

    如需詳細了解應用的內存,請使用內存性能分析器。

    Dalvik 日志消息

    在 Dalvik(而不是 ART)中,每個 GC 都會將以下信息輸出到 logcat 中:

    D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

    示例:

    D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms GC 原因
    什么觸發了 GC 以及是哪種回收。可能的原因包括: GC_CONCURRENT
    在app的堆開始占用內存時釋放內存的并發 GC。
    GC_FOR_MALLOC
    堆已滿而系統不得不停止應用并回收內存時,應用嘗試分配內存而引起的 GC。
    GC_HPROF_DUMP_HEAP
    當請求創建 HPROF 文件來分析堆時發生的 GC。
    GC_EXPLICIT
    顯式 GC,例如當調用 gc() 時(開發者應避免調用它,而應信任 GC 會根據需要運行)。
    GC_EXTERNAL_ALLOC
    這僅適用于 API 級別 10 及更低級別(更新的版本會在 Dalvik 堆中分配任何內存)。外部分配內存的 GC(例如存儲在原生內存或 NIO 字節緩沖區中的像素數據)。
    釋放量
    從此次 GC 中回收的內存量。
    堆統計數據
    堆的可用空間百分比與(活動對象數量)/(堆總大小)。
    外部內存統計數據
    API 級別 10 及更低級別的外部分配內存(已分配內存量)/(發生回收的限值)。
    暫停時間
    堆越大,暫停時間越長。并發暫停時間顯示兩個暫停:一個出現在回收開始時,另一個出現在回收快要完成時。

    在此類日志消息積聚時,請注意堆統計數據(上面示例中的 3571K/9991K 值)的增大情況。如果此值繼續增大,可能會出現內存泄露。

    ART 日志消息

    與 Dalvik 不同,ART 不會為未明確請求的 GC 記錄消息。只有在系統認為 GC 速度較慢時才會輸出 GC 消息。更確切地說,僅在 GC 暫停時間超過 5 毫秒或 GC 持續時間超過 100 毫秒時。如果應用未處于可察覺到暫停的狀態(例如應用在后臺運行時,這種情況下,用戶無法察覺 GC 暫停),則其所有 GC 都不會被視為速度較慢。系統一直會記錄顯式 GC。

    ART 會在其垃圾回收日志消息中包含以下信息:

    I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects,Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

    示例:

    I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects,21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms GC 原因
    什么觸發了 GC 以及是哪種回收。可能的原因包括: Concurrent
    不會掛起應用線程的并發 GC。此 GC 在后臺線程中運行,而且不會阻止分配。
    Alloc
    應用在堆已滿時嘗試分配內存而引起的 GC。在這種情況下,垃圾回收在分配線程中發生。
    Explicit
    由應用明確請求的垃圾回收,例如,通過調用 gc() 或 gc()。與 Dalvik 一樣,在 ART 中,最佳做法是信任 GC 并避免請求顯式 GC(如果可能)。不建議請求顯式 GC,因為它們會阻止分配線程并不必要地浪費 CPU 周期。此外,如果顯式 GC 導致其他線程被搶占,則也可能會導致卡頓(應用出現卡頓、抖動或暫停)。
    NativeAlloc
    原生分配(例如位圖或 RenderScript 分配對象)導致出現原生內存壓力,進而引起的回收。
    CollectorTransition
    由堆轉換引起的回收;這由在運行時變更 GC 策略引起(例如應用在可察覺到暫停的狀態之間切換時)。回收器轉換包括將所有對象從空閑列表空間復制到碰撞指針空間(反之亦然)。

    回收器轉換僅在以下情況下出現:在 Android 8.0 之前的低內存設備上,應用將進程狀態從可察覺到暫停的狀態(例如應用在前臺運行時,這種情況下,用戶可以察覺 GC 暫停)更改為察覺不到暫停的狀態(反之亦然)。

    HomogeneousSpaceCompact
    同構空間壓縮是空閑列表空間到空閑列表空間壓縮,通常在應用進入到察覺不到暫停的進程狀態時發生。這樣做的主要原因是減少內存使用量并對堆進行碎片整理。
    DisableMovingGc
    這不是真正的 GC 原因,但請注意,由于在發生并發堆壓縮時使用了 GetPrimitiveArrayCritical,回收遭到阻止。一般情況下,強烈建議不要使用 GetPrimitiveArrayCritical,因為它在移動回收器方面存在限制。
    HeapTrim
    這不是 GC 原因,但請注意,在堆修剪完成之前,回收會一直受到阻止。
    GC 名稱
    ART 具有可以運行的多種不同的 GC。 Concurrent mark sweep (CMS)
    整個堆回收器,會釋放和回收除映像空間以外的所有其他空間。
    Concurrent partial mark sweep
    幾乎整個堆回收器,會回收除映像空間和 Zygote 空間以外的所有其他空間。
    Concurrent sticky mark sweep
    分代回收器,只能釋放自上次 GC 后分配的對象。此垃圾回收比完整或部分標記清除運行得更頻繁,因為它更快速且暫停時間更短。
    Marksweep + semispace
    非并發、復制 GC,用于堆轉換以及同構空間壓縮(對堆進行碎片整理)。
    釋放的對象
    此 GC 從非大型對象空間回收的對象數量。
    釋放的大小
    此 GC 從非大型對象空間回收的字節數量。
    釋放的大型對象
    此垃圾回收從大型對象空間回收的對象數量。
    釋放的大型對象大小
    此垃圾回收從大型對象空間回收的字節數量。
    堆統計數據
    可用空間百分比與(活動對象數量)/(堆總大小)。
    暫停時間
    通常情況下,暫停時間與 GC 運行時修改的對象引用數量成正比。當前,ART CMS GC 僅在 GC 即將完成時暫停一次。 移動 GC 的暫停時間較長,會在 GC 的大部分時間持續。

    如果在 logcat 中看到大量 GC,請注意堆統計數據(上面示例中的 25MB/38MB 值)的增大情況。如果此值繼續增大,且始終沒有變小的趨勢,可能會出現內存泄漏。或者,如果看到原因為“Alloc”的 GC,則您已快要達到堆容量上限,并且很快會出現 OOM 異常。

    總結

    以上是生活随笔為你收集整理的Android日志[进阶篇]一-使用 Logcat 写入和查看日志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。