androidstuido 查看logs_使用 Logcat 写入和查看日志
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 工具欄中提供以下按鈕:
Clear logcat
:點擊此按鈕可以清除顯示的日志。
Scroll to the end
:點擊此按鈕可以跳轉到日志底部并查看最新的日志消息。如果您先點擊此按鈕,然后點擊日志中的某一行,則視圖會在相應位置暫停滾動。
Up the stack trace
和 Down the stack trace
:點擊相應按鈕可以在日志的堆棧軌跡中進行上下導航,從而選擇輸出的異常中顯示的后續文件名(以及在編輯器中查看相應行號)。這與您在日志中點擊某個文件名時的行為相同。
Use soft wraps
:點擊此按鈕可以啟用換行并防止水平滾動(盡管所有非間斷字符串仍然需要進行水平滾動)。
:點擊此按鈕可以輸出 logcat 消息。在顯示的對話框中選擇輸出偏好設置后,您還可以選擇將其保存為 PDF 格式。
Restart
:點擊此按鈕可以清除日志并重啟 logcat。與 Clear logcat 按鈕不同,此按鈕可以恢復并顯示之前的日志消息,因此當 Logcat 無響應而您又不想失去日志消息時,此按鈕是最有用的。
Logcat header
:點擊此按鈕可以打開 Configure Logcat Header 對話框,在該對話框中,您可以自定義各個 logcat 消息的外觀,例如是否顯示日期和時間。
Screen capture
:點擊此按鈕可以截取屏幕截圖。
Screen record
:點擊此按鈕可以錄制設備屏幕的視頻(時長不超過 3 分鐘)。
寫入日志消息
通過
有關更完整的選項列表,請參閱
除開發期間外,其他任何時候都絕不應將詳細日志編譯到您的應用中。雖然會編譯調試日志,但會在運行時將其去掉,而錯誤、警告和信息日志會始終保留。
對于每種日志方法,第一個參數都應是唯一標記,第二個參數都應是消息。系統日志消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如 ActivityManager)。標記可以是您認為有用的任何字符串,例如當前類的名稱。
一種比較好的做法是,在要用于第一個參數的類中聲明 TAG 常量。例如,您可以按如下方式創建一條信息日志消息:
Kotlin
private const val TAG = "MyActivity"
...
Log.i(TAG, "MyClass.getView() — get item number $position")Java
private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);
注意:長度超過 23 個字符的標記名稱在 logcat 輸出中會被截斷。
Logcat 消息格式
每個 Android 日志消息都有一個與之相關聯的標記和優先級。系統日志消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如 ActivityManager)。用戶定義的標記可以是您認為有用的任何字符串,例如當前類的名稱(建議的標記)。您可以在 Log 方法調用中定義它,例如:
Kotlin
Log.d(tag, message)Java
Log.d(tag, message);
優先級是以下值之一:
V:詳細(優先級最低)
D:調試
I:信息
W:警告
E:錯誤
A:斷言
日志消息的格式為:
date time PID-TID/package priority/tag: message
例如,下面的日志消息的優先級為 V,標記為 AuthZen:
12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: 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 并搜索特定日志消息。
讀取垃圾回收消息
有時,發生垃圾回收事件時,相應消息會輸出到 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
在您的堆開始占用內存時釋放內存的并發 GC。
GC_FOR_MALLOC
您的堆已滿而系統不得不停止您的應用并回收內存時,您的應用嘗試分配內存而引起的 GC。
GC_HPROF_DUMP_HEAP
當您請求創建 HPROF 文件來分析堆時發生的 GC。
GC_EXPLICIT顯式 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由應用明確請求的垃圾回收,例如,通過調用
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 異常。
總結
以上是生活随笔為你收集整理的androidstuido 查看logs_使用 Logcat 写入和查看日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 取值方法_我国细骨料试验方法标准分析及修
- 下一篇: vue 计算属性和data_Vue计算属