Android IPC基础之Binder 机制

IPC

概念 :进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程
起由 :两个对象能直接相互访问的前提是这两个对象都存在于相同的内存地址空间中,如果两个对象分别存在于两个不同的进程中,那么这两个对象是不能直接相互调用的,需要跨进程通信技术

Binder 机制

Binder 是Android 中的一个类,它实现了IBinder 接口。Android 开发中,Binder 主要用在Service 中,包括AIDL 和Messenger ,其中普通Service中Binder不涉及进程间通信,而Messenger的底层其实是AIDL;所有可以在Binder中传输的接口都需要集成IInterface 接口

  • 从IPC 角度来说,Binder 是Android 中的一种跨进程通信方式,Binder 可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux 中没有
  • 从Android Framework 角度来说,Binder 是ServiceManager 连接各种Manager(ActivityManager、WindowManager等等)和相应ManagerService 的桥梁
  • 从Android 应用层来说,Binder 是客户端与服务器进行通信的媒介,当bindService的时候,服务器端会返回一个包含了服务器端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务器端提供的服务或者数据,这里的服务包括普通服务器和基于AIDL的服务

Binder 组成

Binder 所涉及的四个重要模块:Client、Server、Server Manager 和Binder Driver
在这里插入图片描述
图解

  1. Binder Driver 位于内核空间中,以字符设备中的misc类型注册,通过open 和ioctl 文件操作函数与Binder Driver 进行通信,主要负责Binder 通信建立,以及其在进程间的传递和Binder 引用计数管理/数据包管理
  2. Binder Client 与 Binder Server之间的跨进程通信则统一通过Binder Driver 处理转发
  3. Binder Client 使用的Binder 的name 以及该Binder 实体在ServerManager 中0号引用,通过0号引用去访问Server Manager获取该Binder 引用(Binder 引用就是由Server Manager 来转换的),就可以调用Binder 实体方法;Binder Client通过 ServerManager来查询Binder Server 接口。
  4. Binder Server 在生成一个Binder 实体的同时会为其绑定一个名字并将这个名字封装成一个数据包传递给Binder Driver,Binder Driver接收到这个数据包后,如果发现这个Binder 是新传递过来的,就会为其在内核空间中Binder实体节点(Binder_node)和一个实体节点引用(Binder_ref),创建完毕后,Binder Driver就会将该引用传递给ServerManager ,ServerManager收到后就会从中取出该Binder 的名字和引用插入一张数据表中。

注意: ServerManager 是一个标准的Binder Server,并且在Android中约定其在Binder通信过程中唯一标识是0

ServerManager

主要功能是将Binder以字符表示的名字转换为一个引用

 public interface IServiceManager extends IInterface
30{
31    
36    IBinder getService(String name) throws RemoteException;
38  
42    IBinder checkService(String name) throws RemoteException;
43
48    void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags)
49            throws RemoteException;
50
54    String[] listServices(int dumpFlags) throws RemoteException;

60    void setPermissionController(IPermissionController controller)
61            throws RemoteException;
62
63    static final String descriptor = "android.os.IServiceManager";
64
65    int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
66    int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
67    int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
68    int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
69    int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
70    int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5;
90}

对于在 Client 端的ServiceManagerNative 和ServiceManagerProxy 则实现这个接口。

猜你喜欢

转载自blog.csdn.net/xufei5789651/article/details/99061840