+------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| +------------+ +-------+ +-----------+ create and public server socket
linuz內核加載完成後,運行init.rc腳本:android
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
這裏要注意兩點:app
create rumtime +-----------+ +----------+ |app_process+----------> |ZygoteInit| +-----------+ +-----+----+ | | | registerZygoteSocket() | +------+ startSystemServer() | |System| <-------+ | +------+ fork | runSelectLoopMode() | v
/system/bin/app_process 啓動時建立了一個AppRuntime對象。經過AppRuntime對象的start方法,經過JNI調用建立了一個虛擬機實例,而後運行com.android.internal.os.ZygoteInit類的靜態main方法,傳遞true(boolean startSystemServer)參數。socket
ZygoteInit類的main方法運行時,會經過registerZygoteSocket方法建立一個供ActivityManagerService使用的server socket。而後經過調用startSystemServer方法來啓動System進程。最後經過runSelectLoopMode來等待AMS的新建進程請求。函數
在registerZygoteSocket方法中,經過名爲ANDROID_SOCKET_zygote的環境獲取到zygote啓動時建立的socket的fd,而後以此來建立server socket。oop
在startSystemServer方法中,經過Zygote.forkSystemServer方法建立了一個子進程,並將其用戶和用戶組的ID設置爲1000。佈局
在runSelectLoopMode方法中,會將以前創建的server socket保存起來。而後進入一個無限循環,在其中經過selectReadable方法,監聽socket是否有數據可讀。有數據則說明接收到了一個請求。
selectReadable方法會返回一個整數值index。若是index爲0,則說明這個是AMS發過來的鏈接請求。這時會與AMS創建一個新的socket鏈接,幷包裝成ZygoteConnection對象保存起來。若是index大於0,則說明這是AMS發過來的一個建立新進程的請求。此時會取出以前保存的ZygoteConnection對象,調用其中的runOnce方法建立新進程。調用完成後將connection刪除。
這就是Zygote處理一次AMS請求的過程。線程
+ | | v fork() +--------------+ |System Process| +------+-------+ | | RuntimeInit.zygoteInit() commonInit, zygoteInitNative | init1() SurfaceFlinger, SensorServic... | | | init2() +------------+ +-------> |ServerThread| | +----+-------+ | | | | AMS, PMS, WMS... | | | | | | v v
System進程是在ZygoteInit的handleSystemServerProcess中開始啓動的。code
首先,由於System進程是直接fork Zygote進程的,因此要先經過closeServerSocket方法關掉server socket。server
調用RuntimeInit.zygoteInit方法進一步啓動System進程。在zygoteInit中,經過commonInit方法設置時區和鍵盤佈局等通用信息,而後經過zygoteInitNative方法啓動了一個Binder線程池。最後經過invokeStaticMain方法調用SystemServer類的靜態Main方法。對象
SystemServer類的main經過JNI調用cpp實現的init1方法。在init1方法中,會啓動各類以C++開發的系統服務(例如SurfaceFlinger和SensorService)。而後回調ServerServer類的init2方法來啓動以Java開發的系統服務。
在init2方法中,首先會新建名爲"android.server.ServerThread"的ServerThread線程,並調用其start方法。而後在該線程中啓動各類Service(例如AMS,PMS,WMS等)。啓動的方式是調用對應Service類的靜態main方法。
首先,AMS會被建立,但未註冊到ServerManager中。而後PMS被建立,AMS這時候才註冊到ServerManager中。而後到ContentService、WMS等。
註冊到ServerManager中時會制定Service的名字,其後其餘進程能夠經過這個名字來獲取到Binder Proxy對象,以訪問Service提供的服務。
執行到這裏,System就將系統的關鍵服務啓動起來了,這時候其餘進程即可利用這些Service提供的基礎服務了。
最後會調用ActivityManagerService的systemReady方法,在該方法裏會啓動系統界面以及Home程序。
+----------------------+ +-------+ +----------+ +----------------+ +-----------+ |ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit| +--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+ | | | | | | | | | | startProcessLocked() | | | | +---------------> | | | | | | start() | | | | | "android.app.ActivityThread" | | | +-----------------> | | | | | | | | | | | | | | | |openZygoteSocketIfNeeded() | | | +------+ | | | | | | | | | | | <----+ | | | | | | | | | |sZygoteWriter.write(arg) | | | +------+ | | | | | | | | | | | | | | | | | <----+ | | | | | | | | | +--------------> | | | | | | | | | | |runSelectLoopMode() | | | | +-----------------+ | | | | | | | | | | | <---------------+ | | | | | acceptCommandPeer() | | | | | | | | | | | | | | runOnce() | | | | +------------------> | | | | | |forkAndSpecialize() | | | +-------------+ | | | | | | | | | | | <-----------+ | | | | | handleChildProc() | | | | | | | | | | | | | | | | | | | zygoteInit() | | | | +-------------> | | | | | | | | | | |in^okeStaticMain() | | | | +----------------> | | | | |("android.app.ActivityThread") | | | | | | | | | | + + + + +