Android之binder详解

本文详细介绍了Android的Binder机制,包括binder系统架构、层次设计、服务使用、Java及C++开发binder服务的方法,以及binder核心类的声明与实现,如DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE等。

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

binder系统架构

在这里插入图片描述
如上图系统架构主要有4部分构成
1、binder驱动,为binder提供底层操作函数,主要函数是ioctl()
2、serviceManager:这是有deamon,为binder提供查询,注册等功能,对于binder服务,通常使用唯一的字符串作为标识。
3、binder服务端:binder服务的提供者
4、binder客户端:binder服务的使用者

一、层次设计

binder层次关系图
如上图所示,binder的层次关系图可分为三个部分,
最上层为framework的各种binder服务类和接口类。
最底层的为binder驱动,主要提供了open,ioctl和close这三个接口。
中间两层分别为binder核心类和IPCThreadState,
binder核心类提供Ibinder和Bbinder和Bpbinder,IPCThreadState提供了与Bnbinder和Bpbinder的在驱动层的交互接口。

所以:从整体上来说,分为两层比较合适,运用层为framework的服务类和接口类以及为它提供基础功能的binder核心类,我们可以将这一层叫做binder的运用逻辑层,而IPCThreadState和驱动可以叫做数据链路层,主要提供硬件业务员的交互。

二、binder服务的使用

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService("xxx");//查找已经注册名为"xxx"的binder服务,返回IBinder的引用对象
ICameraService service = ICameraService.stub.asInterface(binder);//,实际使用的时候需要将这个引用对用转换为代理对象。

用defaultServiceManager()来获取serviceManager服务的引用对象,然后调用getService来获取注册了的Binder服务,如果查找到名称对应的服务则返回该服务的IBinder,否则返回NULL。IBinder是一个引用对象,实际使用的时候,需要将引用对象转为为代理对象方可使用:

想一下、既然defaultServiceManager()可能会不存在返回NULL,我们为什么没有判断它的返回值勒?
答: ServiceManager会在运用启动之前启动,而且不会停止,所以我们可以不用检查返回值为NULL的情况。

三:java开发binder服务

第一步:编写aidl文件。

interface IExampleService{
   
	int get();
	void set(int value);
};

aidl解析器会根据我们编写接口来自动生成服务器和客户端的java代码。

第二步:编写server的代码

public class ExampleService extends Service{
   
	int mValue;
	private final IExampleService.Stub mInstance = new 	IExampleService.Stub(){
   
	public int get(){
   
		return mValue;
	}
	public voi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值