zoukankan      html  css  js  c++  java
  • SystemServer概述

    SystemServer由Zygote fork生成的,进程名为system_server,该进程承载着framework的核心服务.

    调用流程如下:

    上图前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创建完成。

    2.forkSystemServer

    调用nativeForkSystemServer()方法fork system_server进程

    3.nativeForkSystemServer

    当system_server进程创建失败时,将会重启zygote进程。这里需要注意,对于Android 5.0以上系统,有两个zygote进程,分别是zygote、zygote64两个进程,system_server的父进程,一般来说64位系统其父进程是zygote64进程

    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优化操作,启动应用进程

    6.performSystemServerDexOpt

    将classPath字符串中的apk,分别进行dex优化操作。真正执行优化工作通过socket通信将相应的命令参数,发送给installd来完成。

    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发送消息到主线再处理.

    二、服务启动阶段

    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中的消息到来,则马上进入执行状态。

    三、服务类别

    system_server进程,从源码角度划分为引导服务、核心服务、其他服务3类。 

    1. 引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
    2. 核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;
    3. 其他服务(70个+):AlarmManagerService、VibratorService等。

    合计总大约80个系统服务:

     

  • 相关阅读:
    如何将DataTable转换成List<T>
    关于SqlDataAdapter的使用
    VS 2010中JS代码折叠插件
    ASP.net中的几种分页方法
    学习jquery基础教程的一些笔记
    js中innerHTML与innerText的用法与区别
    SpringBoot 中使用shiro注解使之生效
    redis分布式锁
    使用ZSetOperations(有序)操作redis
    使用SetOperations(无序)操作redis
  • 原文地址:https://www.cnblogs.com/krislight1105/p/10156748.html
Copyright © 2011-2022 走看看