Android Binder机制
前言
同一个程序中,有两个函数A和B。A能直接调用B,B能直接调用A,根本原因是他们处于相同的内存空间中时,虚拟地址的映射规则完全一致。
如果是两个进程,他们是没办法通过内存地址来访问对方内部的函数和变量的。
因此,Android提供了Binder来处理进程间通信,他是Android中使用最广泛的IPC机制。比如AIDL,就是利用Binder实现的。
Binder的关联元素
Binder通信的过程类似于TCPIP协议,下面我们类比一下
Binder驱动(路由器)
Service Manager(DNS)
Binder Client(客户端)
Binder Server(服务器)
客户端根据域名通过路由器向DNS请求IP,再根据IP通过路由器访问Server
Server向SM注册,Client通过驱动向Service Manager根据公共ID请求本机临时ID,再根据临时ID通过驱动访问Server
Android为什么选择Binder
Linux的IPC手段有很多,比如管道、共享内存、Socket。但是Android使用较多的还是Binder。
考虑到两个主要因素:性能和安全。
性能方面:
管道采用内核缓冲区模式,数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
而Socket传输效率低,开销大,因为经过了网络层,用于跨网络进程交互比较多。
共享内存虽然无需拷贝,但控制复杂,难以使用。
安全方面:
传统IPC只能用户在数据包中填入UID/PID,这样是不可靠的,容易被恶意程序利用。
其次传统IPC访问接入点是开放的,比如命名管道的名称、system V的键值、socket的ip地址或文件名,无法建立私有通道。无法阻止恶意程序通过猜测接收方地址获得连接。
Binder基于 Client-Server通信模式,传输过程只需一次拷贝,为发送发添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。
面向对象的 Binder IPC:
面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,而它的引用却遍布于系统的各个进程之中。最诱人的是,这个引用和java里引用一样既可以是强类型,也可以是弱类型,而且可以从一个进程传给其它进程,让大家都能访问同一Server,就像将一个对象或引用赋值给另一个引用一样。Binder模糊了进程边界,淡化了进程间通信过程,整个系统仿佛运行于同一个面向对象的程序之中。
面向对象只是针对应用程序而言,对于Binder驱动和内核其它模块一样使用C语言实现,没有类和对象的概念。Binder驱动为面向对象的进程间通信提供底层支持。
手写进程通信
定义接口服务
代表服务端的能力
public interface PersonManger extends IInterface {
void addPerson(Person mPerson);
List<Person> getPersonList();
}
定义Server中的Binder实体。继承Binder和接口
绑定服务
绑定服务是服务器在C/S架构中的接口。他使得像Activity一样的组件能够绑定服务、发送请求、接受回复,执行IPC。
绑定服务通常只在他为另一个应用程序组件提供服务时存在,不会无期限地在后台运行。
绑定服务类需要实现Service类,使得其他应用能够绑定并与之交互。
为了实现绑定,需要实现onBind()回调方法。这个方法返回一个IBinder对象,这个对象定义了客户端可以与这个服务交互的接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧