Binder IPC
本文整理自: 《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.pngServiceManager的作用
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()时,会区分请求服务所属进程情况。