Binder是IPC(进程间通信)方式的一种
为啥要用多进程呢?
每个应用占有单独的进程,虚拟机给每个应用分配的内存的有限的,也就是分配给每个进程的内存是有限的,如果我们把所有功能都放在一个进程中,向下载,加载大图片等很消耗内存,很容易造成主进程的内存耗尽,导致oom,所以可以另起一个进程来处理这些操作,并且在新的进程中,即便这些操作出bug了,也不会影响主进程运行
进程间如何通信的?
首先进程间是不能直接通信的,每个应用也就是进程分为用户空间和内核空间,用户空间之间是隔离的,但是内核空间是相通的,所以我们就可以将数据从用户空间A先传到内核空间,然后从内核空间再把数据传递到用户空间B进行接收,这样就形成了进程间的数据传递,也就是通信了
在binderservice时候,传递的第二个参数ServiceConnection中,asInterface, 这时候会调系统给生产的aidl文件中Proxy
这个Proxy类就是传递数据的,进入这个类里,就会看到我们自己写的aidl中的方法,我这里是addinfo
而通过Proxy中transcat方法将数据传递进binder,在binder中又会调用ontranscat中addinfo ,一调用这个方法这时候就会进入到服务端的stub中,stub是接收数据
一调这个addInfo就会调服务端的
这就形成了通信
Binder相比socket性能较好,相比共享内存较差, 因为Binder是一次拷贝,socket是两次,共享内存不拷贝
拷贝是指 数据传递时,从用户空间调用copy_from_user将数据拷贝到内核空间,或者从内核空间调用copy_to_user到接收数据的用户空间
而Binder只有拷贝到内核空间的一个拷贝,在内核空间中有内存映射,mmap将虚拟内存和接收数据的用户空间映射了一块物理内存,所以不需要再次拷贝,直接映射到用户空间接收
共享内存是传输数据的用户空间,binder和接收数据的用户空间三者形成一块映射空间,直接将数据放进去,所以无需拷贝了
socket是没有映射,用户空间拷贝到binder,binder又拷贝到用户空间接收,所以是两次拷贝
binder中系统会为每个app分配pid,所以会更加安全,而socket是依赖共享协议的,将pid打包进数据包中,然后发送给对方,这个pid是app控制的,系统不知道,不安全
理解的较为浅显,后续继续深入
来源:oschina
链接:https://my.oschina.net/fbf8866/blog/3208796