Binder机制

Binder是什么

binder是怎么?大家都在Activity通过getSystemService()方法赢得系统的Service(譬如:ActivityManagerService,WindowManagerService等),这么些Activity一般都是客商端编写的,而系统的那几个Service是属于服务端的。明显它们不会在同样进度(一般的话,贰个APP单独在叁个经过)。八个经过之间怎么通讯?Binder正是七个进度通讯的中间媒介。

what

Binder是Android系统中的一种IPC进度间通讯结构。不只好够用来贯彻进度件的IPC通讯,仍是能够用来调用另五个进程的函数,协助RPC操作,Binder使用运转在基本空间中的抽象驱动程序Binder(IPC)
Driver,来完结进度间的通讯。

图片 1

Paste_Image.png

图片 2

Paste_Image.png

Binder的使用

编写制定一个一定的Service。服务端:

public class LocationManagerService extends Binder { private static final String TAG = "LocationService"; /** * * @param code 用于标识客户端期望调用服务端的哪个函数 * @param data 客户端传递的参数 * @param reply 返回给客户端的数据 * @param flags 执行IPC的模式,分为两种一种是双向的,用常量0表示,其含义是服务端执行指定服务后返回一定的数据,另一种是单向的,用常量1表示,其含义不返回任何数据 * @return * @throws RemoteException */ @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { switch { case 101: data.enforceInterface; double lat = data.readDouble(); double lng = data.readDouble(); setLocation; reply.writeString("Successful"); break; default: break; } return super.onTransact(code, data, reply, flags); } public void getMyLocation(){ } public void setLocation(double lat,double lng){ }}

Binder机制。劳动的很轻易,从代码的角度来看:只需传承Binder类重写onTransact的不二等秘书诀就可以。在onTransact方法里,大家写了一些代码
switch …case 101;这里就有多少个难点:

  1. 怎么101,不是102照旧其余的?其实code的变量是用以识别客商端期望调用服务端的哪贰个函数。双放供给预订一组code值int类型的。
  2. 服务端怎样掌握data变量中的地方?从地点的代码来看怎么第贰个参数是lat,第一个lng,为啥不能首先个lng,第三个lat?那也亟需互相有个约定。

在上述代码中调用了 data.enforceInterface;是为了校验与顾客端
data.writeInterfaceToken(“LocationManagerService”);相呼应。

客户端:

{ IBinder mRemote = getLocationService("LocationManagerService"); Double lat = 1.2323; Double lng = 1.2434; int code = 101; Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken("LocationService"); data.writeDouble; data.writeDouble; try { mRemote.transact(code,data,reply,0); String replyStr = reply.readString(); } catch (RemoteException e) { e.printStackTrace(); } }

在客商端,大家先是远程获取服务端的Binder对象。获取到该变量后,就可以调用该变量到方法transact方法。该办法的原型是:
public boolean transact(int code, Parcel data, Parcel reply, int
flags);参数与服务端的onTransact方法的参数相对应。

此处多少个很首要的主题素材:

  1. 怎么获取远程的Binder对象?
  2. 客商端须求和服务端约定好两件事
    1. 服务端差别函数code的值
    2. 服务端函数参数的种种。

那四个第一难点是绝对要消除的。对于第多少个难题:当大家扩大系统服务的时候能够行使瑟维斯类(第四次全国代表大会组件之一的Service)来获取Binder对象。那是系统提要求的。这是非至关重要的,当然能够本身写一套方法来取得到这么些远程的Binder对象。

而当大家是扩展客商端服务是必得依照Service类(第四次全国代表大会组件之一的Service)来编排。所谓的连串服务是能够指使用getSystem瑟维斯()方法来获得的劳动,所谓的客商端服务指的是应用程序提供的自定义服务。

对于第4个难点:系统给我们提供了多少个aidl工具,该工具得以把三个aidl文件转变为七个Java类,在该Java类同一时间重载类transact方法和onTransact方法。进而统一了写入参数的逐个和读取参数的逐个。但是aidl工具也是非不可或缺的,也是一心能够友善写一套方法来归并写入参数和读取参数顺序的算法。

利用系统提供的Service和aidl工具来精晓Binder的周转的机制。

why

1.从品质的角度
数据拷贝次数:Binder数据拷贝只需求三遍,而管道、音信队列、Socket都亟待2次,但共享内部存款和储蓄器方式一回内部存款和储蓄器拷贝都无需;从性质角度看,Binder质量紧跟于分享内部存款和储蓄器。

内核刚开始只是分配了一个物理页,并且分别将这个物理页映射到进程的内核虚拟地址空间V1(修改内核空间的页表映射)和进程的用户虚拟地址空间V2(修改用户空间的页表映射)。在用户空间访问V1和在内核空间访问V2,其实都是访问的是同一个物理内存块,从而实现进程的内核和用户空间共享同一块物理内存的目的。这样binder驱动在内核空间,将一段数据拷贝到这个物理页,则该进程的用户空间则不需要copy_to_user()即可以同步看到内核空间的修改,并能够访问这段物理内存。

2.从平静的角度
Binder是依照C/S架构的,轻易表达下C/S架构,是指客户端(Client)和服务端(Server)组成的架构,Client端有啥供给,间接发送给Server端去做到,架构清晰明朗,Server端与Client端相对独立,牢固性较好;而分享内部存款和储蓄器达成格局复杂,没有客商与服务端之别,
须求丰裕思考到寻访临界能源的出现同步难题,不然只怕会油可是生死锁等难点;从那平静角度看,Binder架构优越于分享内部存款和储蓄器。
3.从安全的角度
运用客商空间不能访谈的内部存款和储蓄器空间来调换数据,保险了IPC的拉萨性.

Binder的万事规划是C/S结构,客商端进程经过获得服务端进程的代办,并因此向那一个代理接口方法中读写多少来产生进程间的多寡通讯。
Android之所以选取Binder,小编觉着有2个方面包车型客车案由。
1是安全,每种进程都会被Android系统一分配配UID和PID,不像古板的在数量里投入UID,那就让那贰个恶心进度不或许直接和其余进度通讯,进度间通信的安全性获得提升。
2是高速,像Socket之类的IPC每一遍数据拷贝都要求2次,而Binder只要1次,在表哥大这种财富恐慌的境况下很注重。

内核刚起先只是分配了七个物理页,而且分别将以此概况页映射到进程的木本虚构地址空间V1(修改内核空间的页表映射)和经过的顾客设想地址空间V2(修改客户空间的页表映射)。在顾客空间访问V1和在根本空间访谈V2,其实都是拜望的是同多个轮廓内部存款和储蓄器块,进而实现进度的基础和顾客空间分享同一块物理内部存款和储蓄器的指标。那样binder驱动在基本空间,将一段数据拷贝到那些物理页,则该进度的客户空间则没有必要copy_to_user()即能够同步阅览内核空间的改变,并能够访问这段物理内部存款和储蓄器。

Binder系列
为什么 Android 要采用 Binder 作为 IPC
机制?
Android源码的Binder权限是什么支配?
Android Binder 全剖判(3) —
AIDL原理解析

创建ILocationManager.aidl文件:

interface ILocationManager { Location getLocation(); void setLocation(double lat,double lng);}

若是.aidl文件中用到了自定义的Parcelable对象,必须新建四个和它同名的aidl文件,并在内部表明它为Parcelabe类型。在ILocationManager.aidl中大家采纳Location那么些类。

发表评论

电子邮件地址不会被公开。 必填项已用*标注