简介
Android是如何实现跨进程通信的,大家熟悉的Binder是什么,怎么设计的,进程间的数据如何发送接收的。本文将以及解析,并对Binder驱动实现、Native层实现、Java层实现三块做一个总结分析。
Binder学习思路
- Binder与传统IPC的区别
- Binder驱动的内部设计、数据结构
- Binder驱动与应用程序进程(C/S)之间的通信过程
- Android应用程序通过Binder驱动进行通信的流程
- Android开发人员如何使用Binder通信(AIDL、Java层架构)
基础知识理解
- Unix内核和应用程序进程所使用的物理内存是分开的,内核使用1G的物理内存,其他应用程序有各自的3G物理内存(32位操作系统)
- 因为内核和应用程序的物理内存是分开的,所以两者之间传递数据需要进行数据拷贝
- 内存映射(mmap)可以将两个虚拟内存地址空间(不同进程)映射到同一物理内存段上。实现多进程(或者内核与进程)之间公用一块内存,减少数据拷贝次数
- Unix驱动程序是一个运行在内核态(使用内核对应的物理内存)的程序
- Binder也是一种IPC的实现方式,其与传统的Unix IPC有一定的差别(使用了mmap)
理解Binder驱动的存在
因为要实现跨进程通信,那么,数据是如何传输的,怎么组织的。两个进程之间是如何知道对方的标识(引用)的,这一系列问题,都由Binder驱动解决,每个进程需要为其他进程提供服务(API调用),都需要向Binder驱动注册,其他进程才能知道自己的数据传向哪里。这里大家先忽略ServiceManager的特殊身份。只讨论Binder驱动的觉得定位即可。
这样看来,其实Binder驱动就是一个多个进程之间的中枢神经,支撑起了Android中进程间通信,它内部的设计,与应用程序进程中的业务,不存在任何耦合关系,只负责实现进程间数据通信。可以用如下图来理解Binder驱动与应用程序进程之间的关系。
![bf6d01578348e052a29a61eb470ffad1.png](https://img-blog.csdnimg.cn/img_convert/bf6d01578348e052a29a61eb470ffad1.png)
当然,Android里的Binder架构应该还有ServiceManager这个系统服务。
ServiceManager的存在
ServiceManager下文简称SM,是一个Android操作系统提供的一个系统进程。那么为什么要单独提他呢,因为这个进程里,记录了所有Binder实体(提供服务的Binder实现对象)的信息。
也就是说,SM是用来给应用程序查找其他应用程序的数据中心与校验中心,保障进程间通信的安全新,合法性。
SM是系统服务&#x