Binder IPC

2017-11-19  本文已影响14人  DrunkPian0

本文整理自: 《Binder系列

首先:启动属于不同进程的Activity会触发多次Application的onCreate():


image.png

IPC原理

注意是IPC原理,不是BINDER原理:


image

每个Android的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个4GB的虚拟地址空间,3GB是用户空间,1GB是内核空间,当然内核空间的大小是可以通过参数配置调整的。其中用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。那么Client进程向Server进程通信,需要依赖两个进程可共享的内核空间。Client端与Server端进程的交互可通过ioctl等方法来进行通信交互。

也就是说,由于进程之间的用户空间是不共享的,Binder是通过共享的内核空间来进行通信的(所有的IPC都是如此)。

BINDER原理

image

从图中可以看出无论是注册服务,还是获取服务都离不开Service Manager。ServiceManager是整个Binder通信机制的大管家,是Binder的守护进程

当Service Manager启动之后,Client端和Server端通信时都需要先获取Service Manager接口,才能开始通信服务。

BpBinder和BBinder的区别

image.png

ServiceManager的作用

servicemanager的核心工作就是注册服务和查询服务。

ServiceManger的启动

由init进程调用init.rc启动。当年做安全的时候知道,只要是init进程启动的服务是不能被结束的,init进程fork出来的子进程也是,参考这篇文章

所以说,开机启动过程中会初始化系统的各种Service,并将这些Service向ServiceManager注册。

ServiceManager是由init进程通过解析init.rc文件而创建的,其所对应的可执行程序/system/bin/servicemanager,所对应的源文件是service_manager.c,进程名为/system/bin/servicemanager。

下面三行代码是调用WindowManger实现浮动窗口部分代码。

WindowManager wm = (WindowManager)getSystemService(getApplication().WINDOW_SERVICE);  
View view=LayoutInflater.from(getApplication()).inflate(R.layout.float_layout, null);  
wm.addView(view, layoutParams);

这三行代码就对应了注册(addService)、获取(getService)和使用服务的三个过程。第三行是调用了运行在systemServer进程上的WindowManger的addView函数。

注册服务

服务注册过程(addService)核心功能:在服务所在进程创建binder_node,在servicemanager进程创建binder_ref。 其中binder_ref的desc再同一个进程内是唯一的:

请求服务

请求服务(getService)过程,就是向servicemanager进程查询指定服务,当执行binder_transaction()时,会区分请求服务所属进程情况。

上一篇下一篇

猜你喜欢

热点阅读