读书:《Android系统源代码情景分析》- 简述Zygote进程和System进程的启动
- Overview1. 所有应用程序进程和System进程都由Zygote进程创建:fork()2. Z进程启动时内建一个VM实例3. 系统进程和App进程复制这个虚拟机实例4. Z进程启动之后马上启动System进程5. System进程启动系统关键服务:AMS, ContentService, WMS, PMS- Zygote的启动1. 由Android系
·
- Overview
1. 所有应用程序进程和System进程都由Zygote进程创建:fork()
2. Z进程启动时内建一个VM实例
3. 系统进程和App进程复制这个虚拟机实例
4. Z进程启动之后马上启动System进程
5. System进程启动系统关键服务:AMS, ContentService, WMS, PMS
- Zygote的启动
1. 由Android系统第一个进程init启动
2. Z进程启动中,内建一个socket,名称是“zygote”,用以执行IPC。AMS由此请求Z进程创建新的应用程序进程
3. Z进程用来执行程序/system/bin/app_process:
3.1 app_process主函数调用AppRuntime.start()
3.2 AppRuntime.start()中,创建VM实例,注册JNI方法
3.3 进一步启动Z进程:ZygoteInit.main() - 这里进入Java层
3.3.1 注册zygnote socket - 用来等待AMS请求为app创建进程
3.3.2 启动System server以开启系统进程(具体过程后面了解)
3.3.3 进入等待AMS请求的循环:在这里,AMS通过socket与Z进程建立连接。之后,如果有请求便可以为app创建进程。
- System进程的启动
1. System进程的创建复制了Z进程的地址空间,也获得了其创建的socket,用不到,关掉。
2. System进程的初始化:RuntimeInit
2.1 设置系统进程的时区、键盘布局等
2.2 在系统进程中启动Binder线程池
2.3 调用com.android.server.SystemServer.main()进入剩下的初始化
2.3.1 调用SystemServer.inti1()进入本地方法:
在本地函数中,启动SurfaceFlinger和SensorService服务。这也就是前面说的在System进程中启动关键本地服务。
2.3.2 接下来,本地函数又回调SystemServer.init2()方法,以启动Java层的各项服务
[ 看到这里,发现Android系统的C++层和Java层之间存在双向依赖的关系。也就是,Java层的服务会调用C/C++层的机制来实现业务逻辑,而底层运行的机制又会反调Java层,比如这里 ]
2.3.2.1 启动一个ServerThread线程。
* 这个线程中,先创建一个Looper消息循环
* 接着启动系统的各个服务并注册到Service Manager中。注册使用一个名字字符串。其它进程通过这个名字来获得服务的Binder代理,接着调用服务:
eg. AMS => "activity"
* 然后启动消息循环
2.3.3 最后,将当前线程加入Binder线程池。
[ 关于Binder线程池,在后面进行了解 ]
1. 所有应用程序进程和System进程都由Zygote进程创建:fork()
2. Z进程启动时内建一个VM实例
3. 系统进程和App进程复制这个虚拟机实例
4. Z进程启动之后马上启动System进程
5. System进程启动系统关键服务:AMS, ContentService, WMS, PMS
- Zygote的启动
1. 由Android系统第一个进程init启动
2. Z进程启动中,内建一个socket,名称是“zygote”,用以执行IPC。AMS由此请求Z进程创建新的应用程序进程
3. Z进程用来执行程序/system/bin/app_process:
3.1 app_process主函数调用AppRuntime.start()
3.2 AppRuntime.start()中,创建VM实例,注册JNI方法
3.3 进一步启动Z进程:ZygoteInit.main() - 这里进入Java层
3.3.1 注册zygnote socket - 用来等待AMS请求为app创建进程
3.3.2 启动System server以开启系统进程(具体过程后面了解)
3.3.3 进入等待AMS请求的循环:在这里,AMS通过socket与Z进程建立连接。之后,如果有请求便可以为app创建进程。
- System进程的启动
1. System进程的创建复制了Z进程的地址空间,也获得了其创建的socket,用不到,关掉。
2. System进程的初始化:RuntimeInit
2.1 设置系统进程的时区、键盘布局等
2.2 在系统进程中启动Binder线程池
2.3 调用com.android.server.SystemServer.main()进入剩下的初始化
2.3.1 调用SystemServer.inti1()进入本地方法:
在本地函数中,启动SurfaceFlinger和SensorService服务。这也就是前面说的在System进程中启动关键本地服务。
2.3.2 接下来,本地函数又回调SystemServer.init2()方法,以启动Java层的各项服务
[ 看到这里,发现Android系统的C++层和Java层之间存在双向依赖的关系。也就是,Java层的服务会调用C/C++层的机制来实现业务逻辑,而底层运行的机制又会反调Java层,比如这里 ]
2.3.2.1 启动一个ServerThread线程。
* 这个线程中,先创建一个Looper消息循环
* 接着启动系统的各个服务并注册到Service Manager中。注册使用一个名字字符串。其它进程通过这个名字来获得服务的Binder代理,接着调用服务:
eg. AMS => "activity"
* 然后启动消息循环
2.3.3 最后,将当前线程加入Binder线程池。
[ 关于Binder线程池,在后面进行了解 ]
更多推荐
已为社区贡献2条内容
所有评论(0)