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