SystemServer由Zygote fork生成的,進程名爲system_server
,該進程承載着framework的核心服務.java
調用流程以下:linux
上圖前4步驟(即顏色爲紫色的流程)運行在是Zygote
進程,從第5步(即顏色爲藍色的流程)ZygoteInit.handleSystemServerProcess開始是運行在新建立的system_server
,這是fork機制實現的(fork會返回2次)。安全
準備參數並fork新進程,從上面能夠看出system server進程參數信息爲uid=1000,gid=1000,進程名爲sytem_server,從zygote進程fork新進程後,須要關閉zygote原有的socket。另外,對於有兩個zygote進程狀況,需等待第2個zygote建立完成。app
調用nativeForkSystemServer()方法fork system_server進程socket
當system_server進程建立失敗時,將會重啓zygote進程。這裏須要注意,對於Android 5.0以上系統,有兩個zygote進程,分別是zygote、zygote64兩個進程,system_server的父進程,通常來講64位系統其父進程是zygote64進程oop
fork()建立新進程,採用copy on write方式,這是linux建立進程的標準方法,會有兩次return,對於pid==0爲子進程的返回,對於pid>0爲父進程的返回。優化
關閉父進程zygote複製而來的Socket,設置當前進程名爲"system_server",執行dex優化操做,啓動應用進程ui
將classPath字符串中的apk,分別進行dex優化操做。真正執行優化工做經過socket通訊將相應的命令參數,發送給installd來完成。spa
在RuntimeInit.java中invokeStaticMain方法經過建立並拋出異常ZygoteInit.MethodAndArgsCaller,在ZygoteInit.java
中的main()方法會捕捉該異常,並調用caller.run()
,再經過反射便會調用到SystemServer.main()方法線程
通過上面7個步驟已經進入SystemServer.main()方法。
先初始化SystemServer對象,再調用對象的run()方法
LocalServices經過用靜態Map變量sLocalServiceObjects,來保存以服務類名爲key,以具體服務對象爲value的Map結構。
2.1 performPendingShutdown
當"sys.shutdown.requested"值不爲空,則會重啓或者關機
該過程會建立對象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。
2.3 startBootstrapServices
該方法所建立的服務:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服務.
啓動服務BatteryService,UsageStatsService,WebViewUpdateService
啓動剩餘服務,最後調用AMS.systemReady().
到此, System_server主線程的啓動工做總算完成, 進入Looper.loop()狀態,等待其餘線程經過handler發送消息到主線再處理.
SystemServiceManager的startBootPhase()貫穿system_server進程的整個啓動過程:
其中PHASE_BOOT_COMPLETED=1000
,該階段是發生在Boot完成和home應用啓動完畢。系統服務更傾向於監聽該階段,而不是註冊廣播ACTION_BOOT_COMPLETED,從而下降系統延遲。
各個啓動階段所在源碼的大體位置:
public final class SystemServer { private void startBootstrapServices() { ... //phase100 mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); ... } private void startCoreServices() { ... } private void startOtherServices() { ... //phase480 && 500 mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY); mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); ... mActivityManagerService.systemReady(new Runnable() { public void run() { //phase550 mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY); ... //phase600 mSystemServiceManager.startBootPhase( SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); } } } }
接下來再說說簡單每一個階段的大概完成的工做:
建立四大引導服務:
進入階段PHASE_WAIT_FOR_DEFAULT_DISPLAY
=100回調服務
onBootPhase(100)
而後建立大量服務下面列舉部分:
進入階段PHASE_LOCK_SETTINGS_READY
=480回調服務
onBootPhase(480)
階段480後立刻就進入階段500.
PHASE_SYSTEM_SERVICES_READY
=500,進入該階段服務能安全地調用核心系統服務.
onBootPhase(500)
UiModeManagerService
各大服務執行systemReady():
接下來就緒AMS.systemReady方法.
PHASE_ACTIVITY_MANAGER_READY
=550, AMS.mSystemReady=true, 已準備就緒,進入該階段服務能廣播Intent;可是system_server主線程並無就緒.
onBootPhase(550)
接下來執行: (AMS啓動native crash監控, 加載WebView,啓動SystemUi等),以下
startSystemUi(context);
PHASE_THIRD_PARTY_APPS_CAN_START
=600
onBootPhase(600)
接下來,各類服務的systemRunning過程:
WallpaperManagerService、InputMethodManagerService、LocationManagerService、CountryDetectorService、NetworkTimeUpdateService、CommonTimeManagementService、TextServicesManagerService、AssetAtlasService、InputManagerService、TelephonyRegistry、MediaRouterService、MmsServiceBroker這些服務依次執行其systemRunning()
方法。
在通過一系列流程,再調用AMS.finishBooting()
時,則進入階段Phase1000
。
到此,系統服務啓動階段完成就緒,system_server進程啓動完成則進入Looper.loop()
狀態,隨時待命,等待消息隊列MessageQueue中的消息到來,則立刻進入執行狀態。
system_server進程,從源碼角度劃分爲引導服務、核心服務、其餘服務3類。
合計總大約80個系統服務: