一、Linux内核的基础知识
1.进程隔离/虚拟地址空间(每个进程以为自己独占了一个内存空间,其实是虚拟的,通信需binder)
2.系统调用(内核保护机制告诉程序只能访问许可的资源,内核层与用户空间分离开来,用户可以通过系统调用在用户空间访问内核的某些程序)
3.binder驱动(运行在内核空间中负责各个用户进程通过binder通信的内核来进行交互的一个模块)
二、Binder通信机制介绍
1.为什么要使用binder
1)Android使用的Linux内核拥有着非常多的跨进程通信机制
2)性能(相较之传统的Socket更加高效)
3)安全(有对进程间通信双方的身份校验)
2.binder通信模型
1)通信录:serviceManager
2)电话基站:binder驱动
3.binder通信机制原理
一句话总结:客户端进程只不过是持有了我们服务器端的代理,我们通过代理对象协助驱动去完成了跨进程通信
到底什么是binder!!
1)通常意义下,Binder指的是一种通信机制
2)对于Server进程来说,Binder指的是Binder本地对象/对于Client来说,Binder指的是Binder代理对象
3)对于传输过程而言,Binder是可以进行跨进程传递的对象
三、AIDL
AIDL (Android Interface Definition Language) 是一种接口定义语言,用于生成可以在Android设备上两个进程之间进行进程间通信(Interprocess Communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数,来完成进程间通信。
简言之,AIDL能够实现进程间通信,其内部是通过Binder机制来实现的,后面会具体介绍,现在先介绍AIDL的使用。
AIDL的实现一共分为三部分,一部分是客户端,调用远程服务。一部分是服务端,提供服务。最后一部分,也是最关键的是AIDL接口,用来传递的参数,提供进程间通信。
Stub静态内部类(策略模式)
**asInterface方法(如果a和b是同一进程就不跨进程,否则返回一个Proxy代理类,通过代理对象获取远端数据)
**onTransact方法(根据AIDL函数返回的编号来进行方法调用,这里为传入compute方法的编号来调用compute方法)