星球作业(第十一期)Android中Binder简述

本文介绍了Android中的Binder,作为IPC工具,它在不同层面上的作用,包括用户态与内核态交互、注册与获取、方法调用机制,以及AIDL、Messenger和ContentProvider等使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Binder

什么是binder?简述下它的工作过程和使用场景。


什么是Binder?

Binder是Android中的一个类,实现了IBinder接口;
从IPC的角度来说,Binder是Android中的一种通讯方式;
从Android Framework角度来说,Binder是ServiceManager连接ManagerService和各个Manager(AMS、WMS等)的桥梁;
从Android应用层角度来说,Binder是客户端与服务端通信的媒介,bindService后服务端会给客户端返回一个用于调用服务端方法的binder对象。

总的来说,Binder是跨进程通信时的必要组件。

Binder的工作过程

Binder1

1.用户态和内核态

内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序

对于跨进程操作,我们需要先通过ServiceManager获取ManagerService的binder对象,例如:

ServiceManager.getService(Context.STATUS_BAR_SERVICE)

这个获取的流程就如上图所示,1服务端注册在ServiceManager中,2客户端获取到该注册的对象。这里的客户端、服务端、ServiceManager都属于用户态,彼此之间运行在不同的进程,无法直接进行通信。

Binder则运行在内核态,有自己的线程池,且用户程序可通过固定api进行操作。

2.注册与获取

上图中,服务端通过ServiceManager注册服务,向Binder驱动的全局链表中插入服务端信息,然后向ServiceManager中缓存注册的服务。

客户端通过ServiceManager获取服务端binder对象时,通过ServiceManager获取;ServiceManager会从缓存的服务信息中拿到服务对象。

3.方法调用

客户端通过获取到的binder对象向服务端发送请求。客户端通过上图中蓝色的调用链,将数据copy到内核空间,客户端进入等待状态;Binder驱动向服务端的todo队列中插入一条事务,等待处理完成后将结果copy回来,唤醒客户端进程。

上述过程中进行了两次copy过程,但实际的copy只有一次,即客户端将数据copy至内核时。Binder通过共享内存的方式,客户端与服务端操作同一块内存区域。

Binder的使用场景

AIDL

Messenger

ContentProvider


参考

1.《Android开发艺术探索》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值