https://blog.csdn.net/u012654756/article/details/90674886
zygote怎么启动?
一整见血
init进程fork出zyogte进程
启动虚拟机,注册jni函数,为进入java层做准备
预加载系统资源,如系统主题资源,类等
启动system server,非常重要,里面跑了很多系统服务
进入socket Loop,不断接受socket消息并处理
看两个问题:
系统服务如何启动?
怎么解决系统服务之间互相依赖?
系统服务怎么启动?
系统服务怎么发布,让应用程序可见?
系统服务跑在什么线程?
2)系统服务跑在什么进程?
1))是主线程吗?没有哪个系统服务用了主线程,主线程什么都没干。
2))工作线程?两种情况
有的服务有自己的工作线程:AMS PMS 还有Package manager service //08:03,PMS还是WMS?
还有大家共用的工作线程:DisplayThread, FgTHread, IoThread, UiThread。
DisplayThread是显示用的
FgThread是前台任务
IoThread是Io任务
UiThread是Ui显示的,UiThread并不是主线程,而是一个子线程,所以说明UI的刷新不必一定在主线程,子线程也行
3))跑在binder线程?
一定的,因为应用跨进程调过来肯定先在binder线程里面
作业:
1),为什么系统服务不都跑在binder线程,
2),为什么系统服务不都跑在自己私有的工作线程?
3),跑在binder线程和跑在工作线程,如何取舍?
答案:
1)binder形成是大家共享的,如果系统负载重,binder线程池忙碌,可能影响系统服务响应的实时性,而且如果任务太耗时,长时间占用binder线程也不好。
2)不可能每个服务都启动工作现场,一共上百个系统服务,线程开太多会内存溢出的,太多线程之间切换对性能不利。
3)如果对实时性要求不高,处理不好使的任务可以放在binder线程。
另外启动工作线程可以避免同步问题,因为AP挂检查调用过来是在binder线程池,通过切到工作线程就可以让binder调用序列化,不用到处上锁。
2,怎么解决系统服务启动的互相依赖
服务A依赖服务B,B依赖C
像system server里,系统服务有7 80个,解决复杂的依赖关系不容易,
1)分批次启动,要启动的service分成三批次,
基础的先启动:AMS PMS PKMS,很多service都依赖于他们所以要先启动
2)分阶段启动,通知已启动的service到了什么阶段,哪些资源可以用了,这些service就可以做这个阶段可以做的初始化了。