Android剖析Framework

Zygote进程是怎么启动的?

首先Init进程是Linux进程启动后用户空间的第一个进程,然后去加载inti.rc配置文件,看需要加载哪些服务,Zygote就是其中之一。还有ServiceManager进程。 父进程fork出子进程,如果子进程挂了,那么父进程会收到子进程发送过来的SIGCHLD信号,进而做处理。比如Zygote进程挂了,那么Init进程就收到SIGCHLD信号,继而重启Zygote进程。

Zygote的作用是什么?

1.孵化应用进程。

2.启动systemserver进程。因为启动systemserver进程的时候需要Zygote里面的一些资源,比如常用类,JNI函数,主题资源,共享库等,这样可以避免重复加载资源,提升性能。

 

Zygote进程启动之后做了什么?

1.Zygote的native层:启动Android虚拟机,注册Android的JNI函数,进入Java层。

2.Zygote的Java层:预加载资源(包括主题资源,共享库等),fork出SystemServer,然后进入loop循环.

 

Zygote注意事项:

Zygote的IPC没有采用Binder机制,而是Socket,所以我们应用的Binder机制不是从Zygote继承过来的,而是应用程序创建之后自己启动的Binder机制。

 

孵化应用进程为什么不交给SystemServer来做,而让Zygote来做?

因为SystemServer主要用来提供系统服务,比如AMS,PMS等,如果SystemServer直接孵化应用进程的话,应用进程也会继承这些并不需要的服务,同时职责也变得混乱。

Zygote的IPC通信机制为什么不采用Binder机制?如果这样做有什么问题?

1.Zygote与IPC通信对象systemServer或应用进程为父子关系,使用socket更合适,反而使用binder机制反而复杂繁琐。

2.如果这样做,Zygote和systemServer都有binder机制,会导致相关资源冲突,比如描述符,映射内存。

 

Zygote工作流程图如下:

 

Android系统启动流程?

init.rc里面需要加载的进程有zygote,servicemanager,surfaceflinger和media等。主要需要了解zygote的启动流程,如上。还要了解systemserver的启动流程。下面来看看systemserver启动流程。

zygote启动systemserver进程后,在systemserver进程中初始化相关系统服务AMS,PMS,包括启动bind线程。因为systemserver里面的系统服务需要与我们的应用进程通信,而通信就是通过bind机制。还包括调用Java类的入口函数main(),在main()函数里面加载loop,共享库,创建上下文等。

系统服务是怎么启动的?

把系统服务的binder注册到serviceManager里面,通过这种方式发布系统服务。系统服务跑在什么线程?bind线程。

systemServer启动系统服务时怎么解决相互依赖?

分批启动,分阶段启动。

 

如何使用系统服务?

通过getSystemService(name)方法获取ServiceFetcher,并调用其getService方法。

如何注册系统服务?

通过调用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值