1.引言
看了一段时间关于SystemServer进程的博客,有点小理解,写一篇关于SystemServer的小笔记,然后走一遍过程。
2.正题
ZygoteInit通过startSystemServer方法fork了一个SS进程。这个进程有啥作用呢。
![](https://img.haomeiwen.com/i2837456/9123624222fabd30.png)
handlerSystemServerProcess()方法只要是以下三个方法:
![](https://img.haomeiwen.com/i2837456/0a240ea80f7b55fd.png)
其中applicationInit()很有意思很重要。该方法中有一个,invokeStaticMain方法通过反射调用main方法:
![](https://img.haomeiwen.com/i2837456/1e15d96223262bf4.png)
返回一个异常,这个异常被ZygoteInit的 捕捉到了,进而执行run方法
![](https://img.haomeiwen.com/i2837456/89743c04617cafdd.png)
run方法最终通过反射调用SystemServer的main方法,作用是:
通过以上分析其实main方法的主要作用是:
1、调整系统时间
2、设置属性persist.sys.dalvik.vm.lib.2的值为当前虚拟机的运行库路径
3、装载libandroid_servers.so库,初始化native层service
4、初始化系统Context
5、创建SystemServiceManager对象
6、调用startBootstrapServices(),startCoreServices(),startOtherServices()启动所有的Java服务
![](https://img.haomeiwen.com/i2837456/200c804dd6890153.png)
另外也可以看到为什么说handler默认是主线程,以及android 应用本身就是基于handler/Looper/Message的
startBootstrapServices():启动java层的各种服务。framwork层的服务。例如AMS
![](https://img.haomeiwen.com/i2837456/01a2378d3d2dd195.png)
startCoreServices:启动核心服务:
![](https://img.haomeiwen.com/i2837456/2abc12062d504f6d.png)
startOtherServices也与上面一样启动各种服务。
总结下:SystemServer进程最终会执行到SystemServer类中的main方法中,初始化各种服务器,其中第一个初始化的就是ActivityManagerService。当我们点击启动app的时候。Zygote会对这个消息进行处理,最终执行到applicationInit。那么是在哪里调用方法启动应用的呢?
网友评论