用Eclipse DDMS可以看到下面的線程:
Signal Catcher
Heap Worker
main thread
binder thread #1
binder thread #2
那這些線程都是用來做什麼的呢。
在Android系統中,Java層和c++/c層都可以建立線程。不過Java層建立的線程最終都由c++/c層來實現。使用ddms這個工具可以查看虛擬機器執行個體進程(除zygote本身和由native code建立的進程,比如vold外)所包含的線程大致資訊。比如線程名字,id號,狀態,user time和system time等。
大家可以看到一般一個虛擬機器執行個體進程都包含有如下7個通用的線程,下面大致講一下這些線程的作用和建立流程。
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
9. misc
其他部分線程由java層的api提供,Thread等。