android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口
Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口
在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理。
一、ServiceManager的Java层代理对象(ServiceManagerProxy)的获取过程。
个人感觉JAVA层的ServiceManager的Java服务和Java服务代理的实现结构还是很像的,如下:
Java服务类关系图:
java服务代理的类关系图:
ServiceManager代理对象的获取,是通过ServiceManager类的getIsServiceManager实现的,由ServiceManagerNative的asInterface将一个BinderProxy包装成ServiceManagerProxy实现。
而BinderProxy的获取,则是通过JNI调用android_os_BinderInternal_getContextObject得到的。Java层BinderProxy对象由该函数创建,并且保存在全局变量gBinderProxyOffsets中。
二、Java服务接口的定义与解析。
接口使用AIDL语言定义在.aidl文件中,会编译生成对应接口名称的Java文件。其中
I****Service.Stub 描述一个Java服务,需要被继承,以实现具体的业务。
onTransact用来实现进程间通信。
asInterface将一个BinderProxy包装为I****Service.Stub.Proxy。
I****Service.Stub.Proxy 描述一个Java服务代理对象
三、Java服务的启动过程
1、初始化,主要是在其父类Binder中调用init,进而通过android_os_Binder_init,在C++层中创建JavaBBinderHolder,并将其保存在了gBinderOffsets.mObject中。
2、将服务注册到ServiceManager中,调用ServiceManager的addService即可
四、Java服务代理对象的获取
使用ServiceManagerJava服务代理的getService
五、Java服务的调用
通过获得的服务代理,实际上暴露的为服务的接口,调用对应的功能。
综上:
android中Binder通信机制大体分为三层:
Java层封装的Binder: 使用JNI调用,实际上是通过C++层的Binder代理对象向Binder本地对象发出通信请求。
==============================================================
C++层的服务实现: Binder代理对象经由Binder驱动程序向Binder本地对象请求具体的操作,Binder本地对象
也可能会调用Java层的服务来完成功能。
==============================================================
Binder驱动程序,其实就是一个代理进程与服务进程交流的工具,一个传话筒,不负责具体的业务,其实现本质就是
向内核缓冲区写入定义好的命令协议代码和返回协议代码来协调C++和Java层的Server提供服务。