前言
从上一篇我们知道,在Zygote进程的启动过程中,通过startSystemServer方法,来启动Android中另外一个核心进程SystemServer进程。那么,就来看下SystemServer进程的一些东西。
ZygoteInit#startSystemServer
|
|
- fork进程(和以前进程启动类似)
- handleSystemServerProcess来处理SystemServer进程
ZygoteInit#handleSystemServerProcess
|
|
- 通过umask设置创建文件的默认权限
- 设置进程的nicename
- 获取SYSTEMSERVERCLASSPATH环境变量值(一系列jar),如果需要,进行dex优化
- 在这里,invokeWith为null,所以会通过RuntimeInit.zygoteInit去启动
RuntimeInit.zygoteInit中调用applicationInit,调用invokeStaticMain,然后就会调用SystemServer的main方法。
|
|
在SystemServer的构造函数中,获取mFactoryTestMode值,我们的重点在run方法。
SystemServer#run
run方法的代码如下:
|
|
主要干了这些事:
- 校验时间是否合法(1970)
- 设置语言
- 设置虚拟机库文件
- 如果允许抽样分析器,则开启SamplingProfilerIntegration(抽样分析器)
- clearGrowthLimit 清除内存增长上限
- 设置内存使用率,setTargetHeapUtilization
- 加载android_servers库
- 创建上下文,创建SystemServiceManager,添加到LocalServices
- startBootstrapServices 启动引导服务
- startCoreServices 启动核心服务
- startOtherServices 启动其他服务
最后的启动服务 是核心,我们分别来看下。
SystemServer#startBootstrapServices
|
|
- 启动Installer,用于应用程序安装,卸载,dex优化等等
- 启动ActivityManagerService
- 启动PowerManagerService
- 启动LightsService
- 启动DisplayManagerService
- 启动PackageManagerService
- 启动UserManagerService
- 启动传感器服务(native)
SystemServer#startCoreServices
|
|
同样是启动几个核心的系统服务。
SystemServer#startOtherServices
在这个方法中,同样启动了很多服务,不过,这里不仅仅有startService,也有ServiceManager.addService,不过这个是通过binder,像native注册的服务。
|
|
当启动注册完毕之后,会调用各个服务的systemReady方法。这里就不介绍了。