? ? ? ? 當程序中出現出現線程卡死的現象時候,可以通過DDMS中的Threads項查看線程的運行情況,協助查找問題。今天學習下android studio 中這個工具的使用。
? ? ? ? 1、首先打開工具:Tools->Android->Android device monitor
2、然后找到"Devices",找不到的話,可以通過 Android Device Monitor中:Window->Show View,輸入Devices即可找到。
3、在Device中找到要觀察的進程,選中。
4、在device那欄點擊按鈕"Update Threads"
5、打開Threads一欄,找不到也可以通過Show View中去查,于是可以看到這么個表格
看看每個字段的含義:
(1) ID:虛擬機分配的唯一的線程ID,有的ID左上方有一個"*"號,感覺像是標示這些事系統創建的線程,其他的是用戶創建的。
(2)Tid:Tid:Linux的線程ID號
(3)Status:線程狀態,有如下一些狀態。
? ? runnable: ?可執行,可能正在運行,也可能沒有運行
? ? sleeping:執行了Thread.sleep()
? ? monitor:等待接受一個監聽鎖。
? ? wait::Object.wait(),等待被其他線程喚醒
? ? native:正在執行native代碼,
? ? vmwait:等待虛擬機
? ? zombie:線程在垂死的進程
? ? init:線程在初始化
? ? starting:線程正在啟動
(4)utime:執行用戶代碼的累計時間
(5)stime:執行系統代碼的累計時間
(6)Name:線程的名字, 創建thread的時候,傳入的name就是現實在這里。根據不同名字,也可以看出線程的來源
? 1. main
? ?這個就是主線程了。具體流程待細述。
? 2. HeapWorker
? ?一個異步的工作線程,處理那些需要在單獨線程里面做的避免同步問題的堆操作。其源代碼在 ? ? dalvik/vm/alloc/HeapWorker.*部分。
? 3. Signal Catcher
? ? 這個線程是用來捕獲linux信號和做一些后續處理的。比如說,當一個SIGQUIT (Ctrl-\)信號到 ? ? 達后,這個線程就會掛起虛擬機,并且將所有線程的狀態信息輸出到log。其源代碼在 ? ? ? ? ? ? ?dalvik/vm/SignalCatcher.*部分。
? 4. JDWP
? 這個線程是用來實現Java Debug Wire Protocol的。如果命令行調試器的參數為"suspend=y", ?這樣會暫停虛擬機。這個估計和eclipse的調試和ddms等調試工具相關。其源代碼在 ?dalvik/vm/jdwp/*部分。
?5. Stdio Converter
? 這個線程從標準輸出和標準錯誤輸出讀取信息并將它們轉換為log信息。其源代碼在 ?dalvik/vm/StdioConverter.*部分。
? 6. Compiler
? Android's Jit獨立于目標平臺的部分。其源代碼在dalvik/vm/compiler/Compiler.*
dalvik/vm/interp/Jit.*等部分。
? 7. Binder Thread #%d
? 使用binder進行通訊時用到的線程。其源代碼在frameworks/base/libs/binder/*等部分。
? 以下的線程屬于system_server和應用程序專有線程,視具體應用的需求而定。
? 8. system_server專有
? android.server.ServerThread
? ActivityManager
? ProcessStats
? PackageManager
? FileObserver
? AccountManagerService
? SyncHandlerThread
? UEventObserver
? PowerManagerService
? AlarmManager
? WindowManager
? InputDeviceReader
? WindowManagerPolicy
? InputDispatcher
? ConnectivityThread
? WifiService
? WifiWatchdogThread
? LocationManagerService
? AudioService
? GpsEventThread
? GpsNetworkThread
? android.hardware.SensorManager$SensorThread
? watchdog
?Wallpaper
?com.android.server.MountListener
另外,Thread選中之后可以在下面看到Refresh按鈕,這個點了之后,可以看到線程的函數執行以及啟動線程的代碼,結合Status可以知道目前情況;而出現問題時某個線程一般會變為monitor狀態,這時候就要特別留意他,并refresh下,檢查他的執行情況 ,再結合代碼,一般都能找到問題出在什么地方。