systemservice启动流程

  • Post author:
  • Post category:其他


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就可以做这个阶段可以做的初始化了。



版权声明:本文为weixin_42446445原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。