首页 > 代码库 > android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口

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提供服务。

    

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口