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个系统服务: