android中的Binder(android内核学习记录)

1、Binder概述

Binder,英文的意思是别针,回形针。表面意思是可以把一些东西“绑”在一起。在android中Binder用于完成进程间的通信(IPC),即把多个进程“别”在一起。比如,普通应用程序可以调用音乐播放服务生提供播放、暂停、停止的功能。

Binder工作在Linux层面,属于一个驱动,只中这个驱动不需要硬件,或者说操作的硬件属于一小段内存。从线程角度上讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成的。

2、Binder框架

这里写图片描述

Binder是一种架构,这种架构提供了服务器接口,Binder驱动,客户端三个模块,如图所示。

1、服务端:一个服务端实际上就是一个Binder类的对象,该对象一旦创建,这就启动一个隐藏的线程。该线程下会接收Binder驱动发送的消息,收到消息后会执行到onTransact()方法,并按照方法的参数执行不同的服务代码。因此,实现Binder服务就必须重载onTransact()方法。

重载onTransact()方法的主要内容是把onTransact()方法的参数转换成服务函数的参数,而onTranscat()参数来源于客户端。因此transact()有固定格式,那么onTranscat()就会有固定格式的输出。


2、Binder驱动。任意一个服务端Binder对象被创建时,同时会在Binder中创建一个mRomote对象。该对象也是Binder类。客户端要访问远程服务时,都是通过mRomote对象。


3、客户端。客户端要想访问远程服务,必须获取远程服务所在的Binder对象中对应的mRomote引用。获取mRomote引用后,就可以调用其transact()方法,而在Binder驱动中,mRomote对象也重载了transact()方法,重载的内容主要包括以下:

  • 以线程间消息通信的模式,向服务端发送客户端传来的参数
  • 挂起当前线程,当前线程正是客户端线程,并等待服务端线程执行完指令服务器函数通知(notify)。
  • 接受到服务端的通知,然后继续执行客户端线程,并返回到客户端代码区。
    从这里可以看出,对应用程序开发人员来说,客户端似乎是直接调用远程服务对应的Binder,而事实上则是通过Binder驱动进行了中转,即产生了两个Binder对象,一个是有服务端,一个是在Binder驱动层。所不同的是Binder驱动中的对象不会再产生额外的线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值