Binder是Android中的一种跨进程通信方式。从Android Framework 角度来说Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager等等)和相应ManagerService的桥梁;从Android应用层来说Binder是客服端与服务端进行通信的媒介。下面 对 Binder 面试知识基本面试知识的做个小结,方便后期知识的回顾、补充。
推荐博文:
简单明了,彻底地理解Binder
Android进程间通信(IPC)机制Binder简要介绍和学习计划
1、 Linux 内核基础知识
进程隔离/虚拟地址空间:
进程间是相互独立的,数据不能共享,互不干扰,不同的进程分配在不同的虚拟地址空间中。系统调用:
对内核保护,只对应用程序开放许可的资源;允许应用程序通过系统调用调用内核的部分开放程序。binder驱动:负责各个应用进程间,通过binder通信内核来进行交互的模块。
3、为什么使用Binder
- 性能:相比传统的Socket更高效。
- 安全:安全性高,支持通信双方进行身份验证。
4、Binder通信模型
1、注册建立ServiceManager表。
2、Service1、Service2通过Binder驱动申请注册到ServiceManager中。
3、Client需要与Service2进行通信,跨进程无法直接通信,需要先通过ServiceManger中查询到Service2。借助Binder驱动返回一个Service2的代理对象。Client直接跟Service2代理对象进行操作,通过Binder驱动映射操作Service2真实对象,从而完成通信。
5、Binder跨进程通信
- Service向SM查找表中注册了Object对象的add()方法;
- Client想调用Service中Object对象的add()方法,需要通过Binder驱动向SM查找表中查询是否有Object对象的add()方法,有则返回Client一个Object对象的代理对象Proxy ;
- Client 调用代理对象Proxy的add()方法,Binder驱动进行接收处理去调用真实对象Object的add()方法;
- Object的add()方法执行后返回结果给SM,SM通过Binder驱动将结果返回给Client。
小结:
客户端进程只是持有了服务端进程的一个代理,通过代理对象协助驱动完成跨进程通信。
6、什么是Binder?
- Binder是一种通信机制;
- 对于Service来说Binder指的是Binder本地对象,对于Client来说Binder指的是Binder的代理对象;
- 对于传输过程而言,Binder是可以跨进程传递的对象。
7、AIDL
支持的数据传递类型:
基本数据类型(short 除外)、String、charSequehce、List(元素得序列化)、Map(元素得序列化)、parcelable。应用场景:
AIDL: IPC、多个应用程序、多线程;
Binder: IPC、多个应用程序、没有多线程;
Messager: IPC、没有多线程;通信过程:
- 客户端通过aidl文件生成的java类 中的Stub.asInterface()方法,得到Proxy代理类
- 通过调用Proxy代理类的方法,将参数进行打包后,调用IBinder 的transact()方法,交给底层处理,再回调onTransact()方法,将参数进行解包,调用服务端对应的方法,并将执行结果返回。