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驱动中的对象不会再产生额外的线程。
更多相关文章
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
- (Android design)新闻资讯类android客户端开源拉
- Android线程模型和AsyncTask
- 【Android和iOS】快速切换到主线程更新UI
- android客户端接入新浪、腾讯微博以及人人网
- 理解Android UI与线程交互
- Android单线程模型