Binder的应用层的核心类

来源:互联网 发布:软件项目验收程序 编辑:程序博客网 时间:2024/06/06 16:41
Binder应用层的核心类
C++层
1.libbinder库中的IInterface类,BpInterface类,BnInterface类,BBinder类,BpBinder类和IBinder类共同构成了Binder应用层的核心类。
(1)IInterface类 :主要的功能是用“纯虚函数“定义服务的接口函数
内部有一个比较陌生的宏 DECLARE_META_INTERFACE”使用这个宏将加入一些成员变量和方法到我们定义的类中。主要包括静态成员变量descriptor,静态函数asInterface。变量descriptor是一个字符串,描述Binder服务。在检查从客户端传递的参数是否合法时需要用到它。
函数asInterface()主要用来把Binder的引用对象转换成代理对象,内部判断参数obj是BpBinder对象,还是BBinder对象BpBinder没有重载queryLocalInterface函数,如果obj是一个BpBinder对象,,intr的值也为null,这样就会去new一个代理对象BpExampleService
如果传入的参数obj是BBinder对象,BBinder对象中重载了queryLocalInterface函数 则返回的是参数obj的指针
asInterface函数的作用总结
1)在客户进程中调用asInterface(),会创建一个Binder代理对象,代理对象中包含了引用对象
2)在服务进程中调用asInterface(),直接返回参数的指针。因为在服务进程中可以直接调用服务类,无须再创建代理对象。
(2)BnInterface类:是一个模板类,子类需要重载底层的方法onTransact(),这个函数在运行时会被底层的IPCThread State类调用。内部调用CHECK_INTERFACE来检查Parcel对象中的数据是否正确,检查的原理是取出Parcel对象中从客户端传递过来的类描述字串,并和类中定义的字符串相比较,如果相同就认为正确。接着按照函数排列顺序取出参数,并使用这些参数调用服务端的函数。调用结束后通过reply对象把函数的返回值传递回去。
(3)BpInterface类:是一个模板类,子类是Binder服务在客户端的接口类 BpExampleService类中将实现的IExampleService的接口的作用是把函数调用的信息发送给远端,首先把类的描述字串放到parcel中,接着把调用的参数依次放入,最后调用remote()函数得到Binder引用对象的指针,然后调用它的transcat()函数把这些数据传递给底层。
(4)BBinder 类是服务端的中心,实际的函数实现都在BBinder的继承类中。BBinder负责和更底层的IPCThread打交道。但是当Binder调用从Binder驱动传递过来时,IPCThread会调用BBinder的transcat()函数,然后transcat()函数会调用继承类的onTransact()函数。
(5)BpBinder类是客户端Binder的中心,它也是从IBinder类派生过来的。负责和更底层的IPCThread打交道,
(6)IBinder是BBinder和BpBinder的基类。在应用层看见的只是IBinder.在IBinder类里面有两个接口,localBinder()和remoteBinder().通过localBinder和remoteBinder()返回是否为空判断到底是BpBinder还是BBinder对象。

java层
java层的Binder有自己的框架,当然最后也调用了native层的BpBinder和BBinder类。
1.java层的Binder服务类
android.os.Binder类的地位和C++的BBinder类相当,有三个成员变量,mObject中保存的是native层关联对象的指针;mOwner存放的是Binder继承类的引用,实际上就是Java Binder对象本身;mDescriptor存放的是类的描述字符串。构造时调用它的init()方法,这是一个native方法,工作是创建JavaBBinderHolder类的对象,并把指针保存在Java层Binder类的mObject变量中。因此,JavaBBinderHolder类是Java层的Binder类和底层打交道的关键。javaBBinderHolder类的主要作用是保存了JavaBBinder对象的弱引用,它的函数get()会在第一次调用时创建一个JavaBBinder对象。JavaBBinder是从BBINder类派生来的,它的主要数据成员是 mVM保存的是java虚拟机的指针;mObject保存的是android.os.Binder在native层的JNI对象。
2.java层的Binder引用类
应用在java层调用Binder同样也是通过Binder的代理对象来完成的,通过接口类中的asInterface()方法来完成。java中的接口类一般都通过AIDL自动生成。代理类中与C++一样传入obj判断是引用对象还是服务对象,obj是通过ServiceManager的getService()方法来得到这个IBinder对象的
而这个IBinder是通过Parcel类的readStrongBinder()方法得到的,是在native层创建的


0 0