1.Binder是什么
Binder就是Android中的血管。在Android中我们所使用的Activity,Service等组件都需要和AMS(system_server)
通信,这种跨进程的通信都是通过Binder完成。
机制:Binder是一种进程间通信机制,在android中实现跨进程通信
驱动:Binder是一个虚拟物理设备驱动,也就是Binder驱动,连接客户端,服务端和ServiceManager进程
应用层:Binder是一个能发起通信的java类\
2.为什么要用Binder?
进程的运行内存是有限制的。优先回收对系统资源占用多的进程。(adb shell getprop dalvik.vm.heapsize)
突破进程内存的限制。
功能稳定性,独立的通信进程保持长链接的稳定性。
隔离风险,不稳定的功能放到独立进程,避免主进程崩溃。
3.与传统观IPC比较
数据拷贝指的是copy_from_user或者copy_to_user调用了几次系统调用(syscall)
共享内存控制复杂,易用性差,存在死锁、数据不同步等安全问题
4.内存划分 内存被操作系统划分为两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是个离开的,即使用户的应用程序崩溃了,内核也不受影响。用户空间可以申请系统调用来传递数据,从用户空间拷贝到内核空间通过copy_from_user函数(内核态), 从内核空间拷贝到用户空间通过copy_to_user函数(用户态)
5.Binder传输数据
内存映射(mmap):Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。
实现映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。
Binder就是通过内存映射将发送端内核空间和接收端用户空间指向同一块物理内存,这样就可以共享这块内存,当数据发送端通过系统调用将数据copy到内核空间,因此也就相当于把数据发送到了接收端的用户空间,这样就只有发送端的一次系统调用,所以只有一次拷贝。
Binder的实现 mmap(memory mappin) 内存映射:关联进程中一个虚拟内存和物理内存的对象关联起来,使二者存在映射关系。 如果多进程情况下,虚拟内存和物理内存的共享对象存在映射关系,如果其中一个进程对该对象进程修改, 那其他进程的虚拟内存该对象对应的变化。 对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。 实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘 所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。 用户空间通过系统调用让内核空间完成这些功能 提高数据的读写传输时间性能,减少了数据copy次数。用户空间内核空间直接交互。内存读写代替I/O读写,提高内存利用效率,通过共享内存。 Binder核心原理 注册服务: Service进程向Binder驱动发起服务注册请求 Binder驱动将注册请求转发给ServiceManager ServiceManager进程添加该Service进程。 ServiceManager 中有Service进程的信息 获取服务: Client向Binder驱动发起获取服务的请求,传递要获取服务的名称 Binder驱动将该请求转发给ServiceManager进程 ServiceManager进程查找到Client需要的Service对应的服务信息 通过Binder驱动将获取的服务信息返回给Client进程 使用服务: 首先 Binder 驱动在内核空间创建一个数据接收缓存区; 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系, 以及内核中数据接收缓存区和接收进程用户空间地址的映射关系; 发送方进程通过系统调用 copy_from_user() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射, 因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。 AIDL通信过程是同步的,需要异步,将flag设为one_way