? ? ? ? 當(dāng)程序中出現(xiàn)出現(xiàn)線程卡死的現(xiàn)象時候碧聪,可以通過DDMS中的Threads項查看線程的運行情況犀呼,協(xié)助查找問題枣察。今天學(xué)習(xí)下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左上方有一個"*"號矛纹,感覺像是標(biāo)示這些事系統(tǒng)創(chuàng)建的線程臂聋,其他的是用戶創(chuàng)建的。
(2)Tid:Tid:Linux的線程ID號
(3)Status:線程狀態(tài),有如下一些狀態(tài)。
? ? runnable: ?可執(zhí)行孩等,可能正在運行艾君,也可能沒有運行
? ? sleeping:執(zhí)行了Thread.sleep()
? ? monitor:等待接受一個監(jiān)聽鎖。
? ? wait::Object.wait()肄方,等待被其他線程喚醒
? ? native:正在執(zhí)行native代碼冰垄,
? ? vmwait:等待虛擬機
? ? zombie:線程在垂死的進程
? ? init:線程在初始化
? ? starting:線程正在啟動
(4)utime:執(zhí)行用戶代碼的累計時間
(5)stime:執(zhí)行系統(tǒng)代碼的累計時間
(6)Name:線程的名字, 創(chuàng)建thread的時候,傳入的name就是現(xiàn)實在這里权她。根據(jù)不同名字虹茶,也可以看出線程的來源
? 1. main
? ?這個就是主線程了。具體流程待細述伴奥。
? 2. HeapWorker
? ?一個異步的工作線程写烤,處理那些需要在單獨線程里面做的避免同步問題的堆操作。其源代碼在 ? ? dalvik/vm/alloc/HeapWorker.*部分拾徙。
? 3. Signal Catcher
? ? 這個線程是用來捕獲linux信號和做一些后續(xù)處理的洲炊。比如說,當(dāng)一個SIGQUIT (Ctrl-\)信號到 ? ? 達后尼啡,這個線程就會掛起虛擬機暂衡,并且將所有線程的狀態(tài)信息輸出到log。其源代碼在 ? ? ? ? ? ? ?dalvik/vm/SignalCatcher.*部分崖瞭。
? 4. JDWP
? 這個線程是用來實現(xiàn)Java Debug Wire Protocol的狂巢。如果命令行調(diào)試器的參數(shù)為"suspend=y", ?這樣會暫停虛擬機书聚。這個估計和eclipse的調(diào)試和ddms等調(diào)試工具相關(guān)唧领。其源代碼在 ?dalvik/vm/jdwp/*部分。
?5. Stdio Converter
? 這個線程從標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出讀取信息并將它們轉(zhuǎn)換為log信息雌续。其源代碼在 ?dalvik/vm/StdioConverter.*部分斩个。
? 6. Compiler
? Android's Jit獨立于目標(biāo)平臺的部分。其源代碼在dalvik/vm/compiler/Compiler.*
dalvik/vm/interp/Jit.*等部分驯杜。
? 7. Binder Thread #%d
? 使用binder進行通訊時用到的線程受啥。其源代碼在frameworks/base/libs/binder/*等部分。
? 以下的線程屬于system_server和應(yīng)用程序?qū)S芯€程鸽心,視具體應(yīng)用的需求而定滚局。
? 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按鈕顽频,這個點了之后藤肢,可以看到線程的函數(shù)執(zhí)行以及啟動線程的代碼,結(jié)合Status可以知道目前情況冲九;而出現(xiàn)問題時某個線程一般會變?yōu)閙onitor狀態(tài)谤草,這時候就要特別留意他跟束,并refresh下,檢查他的執(zhí)行情況 丑孩,再結(jié)合代碼冀宴,一般都能找到問題出在什么地方。