Binder框架(1)

Binder工作在linux层,是一个不需要硬件的驱动,从线程角度看,Binder代码运行在内核态,客户端程序使用Binder是通过系统调用完成的。

Binder是一种整体架构,包含服务端接口,Binder驱动,客户端接口三个模块。

1. 服务端

一个Binder服务端实际上就是一个Binder类的对象,该对象一旦创建,内部就启动一个隐藏线程。该线程会接收Binder驱动发送的消息,收到消息后,会执行到Binder对象的onTransact()函数,并按照该函数的参数执行不同的服务代码。

因此,要实现一个Binder服务,就必须重载onTransact()方法。onTransact()函数的主要工作就是把onTransact函数的参数转换成服务函数的参数。onTransact()参数的来源是客户端调用transact()函数时输入的,因此,若transact()有固定格式的输入,那么onTransact()就有固定格式的输出。

2. Binder驱动

Binder驱动是Android在内核中为完成进程间通信而专门设置的一个虚拟设备/dev/binder。任意一个服务端Binder对象被创建时,同时会在Binder驱动中创建一个mRemote对象,该对象的类型也是Binder类。客户端药访问远程服务时,都是通过mRemote对象。mRemote对象也重载了transact()方法,重载的内容主要包括:

  • 以线程间消息通信的模式,向服务端发送客户端传递过来的参数。
  • 挂起当前线程,当前线程正是客户发送线程,并等待服务端线程执行完指定服务函数后通知。
  • 接收服务端程序的通知,然后继续执行客户端线程,并返回到客户端代码区。

3. 客户端(应用程序端)

客户端要想访问远程服务,必须获取远程服务在Binder对象中的mRemote引用。客户端获得mRemote后,就可以直接调用其transact方法了。

4. Binder例子

(1) Service端实现

只要基于Binder类新建一个Service类,然后重载onTransace()函数就可以了。

public class MusicPlayerService extends Binder {

protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) {

switch (code) {      // code用于标识客户端期望调用服务端的哪个函数,由双方约定。该值与客户端的transact()函数中的第一个参数code的值是一致的(可以通过SDK中的aidl工具实现)。

case PLAY: {

data.enforceInterface("MusicPlayerService");     // 为了某种校验,它与客户端的writeInterfaceToKen()对应。

String filePath = data.readString();                 // 从客户端读出传递过来的参数。参数在data变量中的位置需要客户端和服务端双方约定。

start(filePath);

}

break;

default:

break;

}

}

public void start(String filePath) {

}

public void stop() {

}

}

(2) 客户端实现

服务分为系统服务和客户端服务。系统服务指可以通过getSystemService()来获取的服务,客户端服务指应用程序提供的自定义服务。

客户端如何获取Binder对象?

AmS提供了startService()函数用于启动客户端服务。对于客户端来说,可以使用以下两个函数来和一个服务建立连接:

i) public ComponentName startService(Intent intent);

该函数用于启动intent指定的服务,服务启动后,客户端暂时还没有服务端的Binder引用,因此此时还不能调用任何服务的功能。

ii) public boolean bindService(Intent Service, ServiceConnection conn, int flags);

该函数用于绑定一个服务,第二个参数是interface类,它的定义为:

public interface ServiceConnection {

public void onServiceConnected(ComponentName name, IBinder service);

public void onServiceDisconnected(ComponentName name);

}

当客户端请求AmS启动某个Service之后,该Service如果正常启动,那么AmS会远程调用ActivityThread类中的ApplicationThread对象,调用的参数中会包含Service的Binder引用,然后在ApplicationThread中会回调bindService的conn接口。

因此,客户端可以在onServiceConnected方法中哦功能将其中的参数service保存为一个全局变量,从而在客户端的任何地方都可有随时调用该远程服务了。

时间: 2024-10-05 18:00:48

Binder框架(1)的相关文章

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService:会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员, desc是整数, node指向对应服务的binder_node 使用服务时, client构造数据,调用ioctl:数据里含有handle 驱动程序根据

Android aidl Binder框架浅析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Binder框架分为服务器接口.Binder驱动.以及客户端接口:简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客

Binder框架(2)

通过MediaServer详细解析Binder内部实现细节. 1. MediaServer的入口函数 int main(int argc, char** argv) { sp<ProcessState> proc(ProcessState::self()); //获得一个ProcessState实例 // MediaServer作为ServiceManager的客户端,需要向ServiceManager注册服务. // 调用defaultServiceManager,获取一个IServiceM

Android系统中基于Binder的IPC流程框架分析

前言: Activity.Service.BroadcastReceiver.Content Provider是Android的四大应用程序组件,构成一个完整的应用程序的这些组件可以在同一个进程,也可以不在同一个进程,而当这些组件不在同一个进程,需要进行数据交互时就需要一种IPC(Inter-Process Communication)进程间通信机制来完成,而Binder就是提供了IPC功能的一个框架.实现IPC的整个Binder框架包含几个重要组成部分,它们分别是Binder Driver.C

转 理解Android系统Binder机制

一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三种: 1.标准Linux Kernel IPC 接口: 2.标准D-BUS接口: 3.Binder接口. 其中,Binder机制是使用最且最被认可的,因为Binder机制有以下优点: 1.相对于其它IPC机制,Binder机制更加简洁和快速: 2.消耗的内存相对更少: 3.传统的IPC机制可能会增加

Android系统Binder机制学习总结

一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三种: 1.标准Linux Kernel IPC 接口: 2.标准D-BUS接口: 3.Binder接口. 其中,Binder机制是使用最且最被认可的,因为Binder机制有以下优点: 1.相对于其它IPC机制,Binder机制更加简洁和快速: 2.消耗的内存相对更少: 3.传统的IPC机制可能会增加

Android内核之Binder

一,Binder框架讲解Binder是一种框架,这种架构提供了服务端接口,Binder驱动,客户端接口三个模块服务端 一个Binder服务端实际上就是一个Binder类对象,该对象那个一旦创建,内部就会创建一个隐藏的线程,该线程就会接收Binder驱动发送的消息,收到消息后,会执行Binder中的onTransact()函数,并按照该函数的参数执行不同的服务代码,因此 ,要是先一个onTransact()方法Binder驱动Binder驱动,任意一个服务端Binder对象被创建时,同时会在Bin

Android Binder设计与实现篇

摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势.深入了解Binder并将之与传统IPC做对比有助于我们深入领会进程间通信的实现和性能优化.本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binder通信协议了解Binder的设计需求:然后分别阐述Binder在系统不同部分的表述方式和起的作用:

Android Binder机制浅析

Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍其实现,并重点讨论Binder安全相关的内容.详细的Binder设计与实现分析,参考附录4篇文章. 一.Binder 实现 Android Binder由Client.Server.Service Manager和Binder驱动4个部件组成,下图引自网络. 在类UNIX系统中,进程是相互独立的,一