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对象,这个对象定义了客户端可以与这个服务交互的接口。

 

posted @   Miraculous_B  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示