看到android设备的进程列表,发现了好多个进程。但是回忆最近的android app开发,发现所有的相关处理和面试都是集中在systemServer中的,而关于zytote和ServiceManager的东西实际考察和使用较少。
突然想问自己,三者在android中的关系是怎样的。就这个问题,写个比较总结下。
1. 启动顺序关系
ServiceManager最先启动,Zygote再启动,最后启动systemServer。启动顺序决定了进程的依赖性。
1. 启动Zygote目的,就是为了启动systemServer进程。所有的java进程启动都由Zygote完成,systemServer是一个java进程。那么Zygote必然需要在systemServer之前启动。为什么所有的java进程都由zygote启动呢?android为了优化启动速度,在zygote启动时加载很多通用的java模块,这样子在后面启动其他java进程时,可以提高进程的启动速度。
2. ServiceManager最先启动的理由:systemServer的启动中有很多service启动,而这些service启动后,需要使用binder和实际的服务通讯。给ServiceManager中的service提供服务的主体服务服务器由init进程启动,service和主体服务之间的通讯依赖于binder,ServiceManager就是给service和主体服务之间实现通讯的工具。 因此service和主体服务都依赖于ServiceManager,那么ServiceManager 必然是最先启动。
serviceManager所有服务的管理者;任何模块要使用服务必须经过它拿到client端的代理,任何服务想向外提供服务必须先在这里注册,包含如下部分:
- init启动的C程序服务,C程序的client程序获取service代理
- systemServer中启动的serive,获取的client程序获取serivce的代理
- app中启动的service服务,应该是由android sdk框架封装好了,在service启动时被添加到了serviceManager中;client端app程序获取service的代理。
2. 功能逻辑关系
serviceManager只有一个功能就是(提供binder通讯服务)维护系统中支持的binder服务的service list。Zygote的主要功能是创建java进程。SystemServer是一个功能集合,通过serviceManager的binder通讯功能给开发者,同时通过binder功能和实际的主体服务通讯完成功能; 由于绝大多数服务都运行在这里,它还负责处理的系统的各类调度功能,以保证系统中各类状态的有序切换;整体来说SystemServer就是一个代理者,可以调用系统各个模块的功能,同时使得系统各个模块的功能可以有条不紊的运行。SystemServer在启动过程中使用SystemSerivceManager启动了很多systemService,并且将这些systemService添加到了serviceManager中。
app的启动,app通过binder告诉SystemServer,然后SystemServer告诉Zygote,最后Zygote启动app。
app调用service总的来说就是通过serviceManager找到对应服务的binder proxy。那么最后就通过proxy调用到哪一个进程由service所在的进程决定;通过SystemSerivceManager添加到serviceManager中到服务,最终会调用到SystemServer进程,然后处理;还有一些由进程启动后主动添加到serviceManager到服务,本身存在于一个单独到进程中到,例如mediaserver,是由app进程获取到binder proxy后,直接调用到mediaserver进程,但是在app进程中关于mediaServer的proxy代理,在系统层面封装了接口,并没有直接提供proxy对象。
因此
serviceManager中注册了很多service,每一个service对应一个binder代理,但是注意并不是每一个binder代理都可以对应一个唯一的进程,每一个binder 代理都可以对应一个进程中都一个binder服务。
zygote专门用来启动java进程的进程。包含systemServer都是一个java进程。
systemServer整合系统各类服务; app可以通过binder调用到systemServer,而systemServer需要调用实际功能时,可以通过socket和zygote通讯,完成app进程创建;可以通过binder和mediaServer通讯,完成媒体播放。简单来说,就是通过各类进程通讯,调用系统提供都服务完成功能。
由于这里的整合,app开发者只需要使用android的API调用就可以完成绝大多数进程通讯,实现功能。避免app开发者实现各类复杂进程通讯。
那么关于android的serviceManager是如何管理binder的呢?让各个模块和进程都可以保存信息到这里来,未完成的任务,懒得写了网上资料很多,查到的可以直接贴下面评论。