读书:《Android系统源代码情景分析》- 简述Zygote进程和System进程的启动

- 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线程池,在后面进行了解 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值