看到android设备的进程列表,发现了好多个进程。但是回忆最近的android app开发,发现所有的相关处理和面试都是集中在systemServer中的,而关于zytote和ServiceManager的东西实际考察和使用较少。

突然想问自己,三者在android中的关系是怎样的。就这个问题,写个比较总结下。

1. 启动顺序关系

ServiceManager最先启动,Zygote再启动,最后启动systemServer。启动顺序决定了进程的依赖性。

1. 启动Zygote目的,就是为了启动systemServer进程。所有的java进程启动都由Zygote完成,systemServer是一个java进程。那么Zygote必然需要在systemServer之前启动。
2. ServiceManager最先启动的理由:systemServer的启动中有很多service启动,而这些service启动后,需要使用binder和实际的服务通讯。给ServiceManager中的service提供服务的主体服务服务器由init进程启动,service和主体服务之间的通讯依赖于binder,ServiceManager就是给service和主体服务之间实现通讯的工具。 因此service和主体服务都依赖于ServiceManager,那么ServiceManager 必然是最先启动。

2. 功能逻辑关系

serviceManager只有一个功能就是提供binder通讯服务。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的呢?让各个模块和进程都可以保存信息到这里来,未完成的任务,待续。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐