SystemServer概述

SystemServer由Zygote fork生成的,進程名爲system_server,該進程承載着framework的核心服務.java

調用流程以下:linux

上圖前4步驟(即顏色爲紫色的流程)運行在是Zygote進程,從第5步(即顏色爲藍色的流程)ZygoteInit.handleSystemServerProcess開始是運行在新建立的system_server,這是fork機制實現的(fork會返回2次)。安全

1.startSystemServer

 準備參數並fork新進程,從上面能夠看出system server進程參數信息爲uid=1000,gid=1000,進程名爲sytem_server,從zygote進程fork新進程後,須要關閉zygote原有的socket。另外,對於有兩個zygote進程狀況,需等待第2個zygote建立完成。app

2.forkSystemServer

調用nativeForkSystemServer()方法fork system_server進程socket

3.nativeForkSystemServer

當system_server進程建立失敗時,將會重啓zygote進程。這裏須要注意,對於Android 5.0以上系統,有兩個zygote進程,分別是zygote、zygote64兩個進程,system_server的父進程,通常來講64位系統其父進程是zygote64進程oop

  1. 當kill system_server進程後,只重啓zygote64和system_server,不重啓zygote;
  2. 當kill zygote64進程後,只重啓zygote64和system_server,也不重啓zygote;
  3. 當kill zygote進程,則重啓zygote、zygote64以及system_server。

4.ForkAndSpecializeCommon

fork()建立新進程,採用copy on write方式,這是linux建立進程的標準方法,會有兩次return,對於pid==0爲子進程的返回,對於pid>0爲父進程的返回。優化

5.handleSystemServerProcess

關閉父進程zygote複製而來的Socket,設置當前進程名爲"system_server",執行dex優化操做,啓動應用進程ui

6.performSystemServerDexOpt

將classPath字符串中的apk,分別進行dex優化操做。真正執行優化工做經過socket通訊將相應的命令參數,發送給installd來完成。spa

7.zygoteInit-->commonInit-->nativeZygoteInit--> applicationInit-->invokeStaticMain-->MethodAndArgsCaller.run()-->SystemServer.main()

在RuntimeInit.java中invokeStaticMain方法經過建立並拋出異常ZygoteInit.MethodAndArgsCaller,在ZygoteInit.java中的main()方法會捕捉該異常,並調用caller.run(),再經過反射便會調用到SystemServer.main()方法線程

 

通過上面7個步驟已經進入SystemServer.main()方法。

SystemServer啓動流程

1.SystemServer.main

先初始化SystemServer對象,再調用對象的run()方法

2. SystemServer.run

LocalServices經過用靜態Map變量sLocalServiceObjects,來保存以服務類名爲key,以具體服務對象爲value的Map結構。

2.1 performPendingShutdown

當"sys.shutdown.requested"值不爲空,則會重啓或者關機

2.2 createSystemContext

該過程會建立對象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。

2.3 startBootstrapServices

該方法所建立的服務:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服務.

2.4 startCoreServices

啓動服務BatteryService,UsageStatsService,WebViewUpdateService

2.5 startOtherServices

啓動剩餘服務,最後調用AMS.systemReady().

到此, System_server主線程的啓動工做總算完成, 進入Looper.loop()狀態,等待其餘線程經過handler發送消息到主線再處理.

2、服務啓動階段

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);
          }
      }
    }
}

 

接下來再說說簡單每一個階段的大概完成的工做:

2.1 Phase0

建立四大引導服務:

  • ActivityManagerService
  • PowerManagerService
  • LightsService
  • DisplayManagerService

2.2 Phase100

進入階段PHASE_WAIT_FOR_DEFAULT_DISPLAY=100回調服務

onBootPhase(100)

  • DisplayManagerService

而後建立大量服務下面列舉部分:

  • PackageManagerService
  • WindowManagerService
  • InputManagerService
  • NetworkManagerService
  • DropBoxManagerService
  • FingerprintService
  • LauncherAppsService

2.3 Phase480

進入階段PHASE_LOCK_SETTINGS_READY=480回調服務

onBootPhase(480)

  • DevicePolicyManagerService

階段480後立刻就進入階段500.

2.4 Phase500

PHASE_SYSTEM_SERVICES_READY=500,進入該階段服務能安全地調用核心系統服務.

onBootPhase(500)

  • AlarmManagerService
  • JobSchedulerService
  • NotificationManagerService
  • BackupManagerService
  • UsageStatsService
  • DeviceIdleController
  • TrustManagerService
  • UiModeManagerService

  • BluetoothService
  • BluetoothManagerService
  • EthernetService
  • WifiP2pService
  • WifiScanningService
  • WifiService
  • RttService

各大服務執行systemReady():

  • WindowManagerService.systemReady():
  • PowerManagerService.systemReady():
  • PackageManagerService.systemReady():
  • DisplayManagerService.systemReady():

接下來就緒AMS.systemReady方法.

2.5 Phase550

PHASE_ACTIVITY_MANAGER_READY=550, AMS.mSystemReady=true, 已準備就緒,進入該階段服務能廣播Intent;可是system_server主線程並無就緒.

onBootPhase(550)

  • MountService
  • TelecomLoaderService
  • UsbService
  • WebViewUpdateService
  • DockObserver
  • BatteryService

接下來執行: (AMS啓動native crash監控, 加載WebView,啓動SystemUi等),以下

  • mActivityManagerService.startObservingNativeCrashes();
  • WebViewFactory.prepareWebViewInSystemServer();
  • startSystemUi(context);

  • networkScoreF.systemReady();
  • networkManagementF.systemReady();
  • networkStatsF.systemReady();
  • networkPolicyF.systemReady();
  • connectivityF.systemReady();
  • audioServiceF.systemReady();
  • Watchdog.getInstance().start();

2.6 Phase600

PHASE_THIRD_PARTY_APPS_CAN_START=600

onBootPhase(600)

  • JobSchedulerService
  • NotificationManagerService
  • BackupManagerService
  • AppWidgetService
  • GestureLauncherService
  • DreamManagerService
  • TrustManagerService
  • VoiceInteractionManagerService

接下來,各類服務的systemRunning過程:

WallpaperManagerService、InputMethodManagerService、LocationManagerService、CountryDetectorService、NetworkTimeUpdateService、CommonTimeManagementService、TextServicesManagerService、AssetAtlasService、InputManagerService、TelephonyRegistry、MediaRouterService、MmsServiceBroker這些服務依次執行其systemRunning()方法。

2.7 Phase1000

在通過一系列流程,再調用AMS.finishBooting()時,則進入階段Phase1000

到此,系統服務啓動階段完成就緒,system_server進程啓動完成則進入Looper.loop()狀態,隨時待命,等待消息隊列MessageQueue中的消息到來,則立刻進入執行狀態。

3、服務類別

system_server進程,從源碼角度劃分爲引導服務、核心服務、其餘服務3類。 

  1. 引導服務(7個):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
  2. 核心服務(3個):BatteryService、UsageStatsService、WebViewUpdateService;
  3. 其餘服務(70個+):AlarmManagerService、VibratorService等。

合計總大約80個系統服務:

 

相關文章
相關標籤/搜索