赞
踩
Binder是一种进程间通信的机制,Binder就是Android中的血管,在Android中我们使用Activity,Service等组件都需要 和AMS(system_server)进行通信,这种跨进程的通信都是通过Binder完成, Activity,Service等组件和AMS不是同一个进程,其实也是多进程通信。
Binder 相对于传统的 Socket 方式,更加高效。 Binder数据拷贝只需要一次,而管道、消息队列、 Socket 都需要 2 次,共享内存 方式一次内存拷贝都不需要,但实现方式又比较复杂。传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如 Socket 通 信的 IP 地址是客户端手动填入,很容易进行伪造。Binder 机制从协议本身就支持对通信双方做身份校检,从而大大提升了安全性。
首先 Binder 驱动在内核空间创建一个数据接收缓存区;
接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
发送方进程通过系统调用 copyfromuser() 将数据 copy
到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。
当Android系统启动后,会创建一个名称为servicemanager的进程,这个进程通过一个约定的命令BINDERSETCONTEXT_MGR(binderSetconText)向Binder驱动注册,申请成为为ServiceManager,Binder驱动会自动为ServiceManager创建一个Binder实体。并且这个Binder实体的引用在所有的Client中都为0,也就说各个Client通过这个0号引用就可以和ServiceManager进行通信。Server通过0号引用向ServiceManager进行注册,Client通过0号引用就可以获取到要通信的Server的Binder引用。
把发送方的数据放入写缓存(binder_write_read.write_buffer) 【对于接收方来说为读缓存】
接收方之前一直在阻塞状态中,当写缓存中有数据,则会读取数据,执行命令操作
接收方执行完后,会把返回结果同样采用写入缓冲区【对于发送方,为读缓存】
mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。
Binder的数据限制为1M-8K。Sockete最大传输数据量为1M。
Binder驱动没有对open,mmap有调用次数的限制,APP可以通过JNI调用open,mmap来突破这个限制,但是会对当前正在进行Binder调用的APP造成不可想象问题,可以先close Binder驱动,但是一旦这个APP没有Binder通信了,这个APP就不能正常使用了。
AIDL全称Android接口描述语言,是Android开发工具中提供的一种文件格式,通过在文件中预先定义接口,然后快速生成Binder机制的代码,省去了手动编写Binder机制
1M数据。超过限制的数据可以使用 ParcelFileDescriptor来实现超大型文件的跨进程传输。
ParcelFileDescriptor是一个实现了Parcelable接口的类,封装了一个文件描述符,可以通过Binder将它传递给其他进程,从而实现跨进程访问文件或者socket。也可以通过它来创建管道,用于进程间的数据流传输。
好了,跨进程通信就讲到这了,不知道你是否对Binder机制有个大概的认知?如果这篇文章反响不错,博主再更新一下其他的跨进程通信,如Socket
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。