Android binder架构解析

   Android 系统中,多进程间的通信都是依赖于底层 Binder IPC 机制, Binder 机制是一种 RPC 方案,因为 binder 的功能就是在本地“执行”其他进程的功能。 例如:当进程A 中的 Activity 与进程 B 中的 Service 通信时,就使用了 binder 机制。为了完成进程间的通信, binder 使用 AIDL 来描述进程间的接口。

      不仅于此,此外,整个Android系统架构中,采用了大量的binder机制。


1.1 binder通信机制

         Android中的Binder通信采用C/S架构,从组件视角来说,包含ClientServerService Manager以及binder驱动,其中Service Manager用于管理系统中的各种服务。Binder整体通信架构如下图所示:

 

1注册服务(addService)Server进程要先注册ServiceService Manager。该过程:Server是客户端,Service Manager是服务端;

2获取服务(getService)Client进程使用某个Service前,须先向Service Manager中获取相应的Service。该过程:Client是客户端,Service Manager是服务端;

3)使用服务:Client根据得到的Service信息建立与Service所在的Server进程通信的通路,然后就可以直接与Service交互。该过程:client是客户端,server是服务端。


1.2 binder架构

         Android源码中,binder的核心库是在native层实现,但在Java层和native层都有接口供应用程序使用。Binder架构图如下:

 

(1) binder驱动层

         Android因此添加了binder驱动,其设备节点为/dev/binder,主设备号为10binder驱动程序在内核中的头文件和代码路径如下:

kernel/drivers/staging/binder.h

kernel/drivers/staging/binder.c

         binder驱动层的主要作用是完成实际的binder数据传输。

(2) binder adapter

       主要是IPCThreadState.cppProcessState.cpp,源码位于frameworks/native/libs/binder目录下,这两个类都采用了单例模式,主要负责和驱动直接交互。

        a、ProcessState负责打开binder设备,进行一些初始化设置并做内存映射;

        b、IPCThreadState负责直接和binder设备通信,使用ioctl读写binder驱动数据。

(3) Binder核心层

       Binder核心层主要是IBinder及它的两个子类,即BBinderBpBinder,分别代表了最基本的服务端及客户端。源码位于frameworks/native/libs/binder目录下。

       binder service服务端实体类会继承BnInterface,而BnInterface会继承自BBinder,服务端可将BBinder对象注册到servicemananger进程。

       客户端程序和驱动交互时只能得到远程对象的句柄handle,它可以调用调用ProcessStategetStrongProxyForHandle函数,利用句柄handle建立BpBinder对象,然后将它转为IBinder指针返回给调用者。这样客户端每次调用IBinder指针的transact方法,其实是执行BpBindertransact方法。

(4) Binder框架层

      a、Native Binder框架层包含以下类(frameworks/native/libs/binder)IInterfaceBnInterfaceBpInterface,等。

      b、Java框架层包含以下类(frameworks/base/core/java/android/os):

      IBinderBinderIInterfaceServiceManagerNativeServiceManagerBinderInternalIServiceManagerServiceManagerProxy

     Java框架层的类的部分方法的实现在本地代码里(frameworks/base/core/jni)


1.3 binder分层

        Java(App) framework层的binder采用JNI技术来调用native(C/C++ framework)层的binder架构,从而为上层应用程序提供服务。

        native层中,binderC/S架构,分为Bn(Server)Bp(Client),而javabinder在命名与架构上与其非常相近,同样在也实现了一套IPC通信架构。需要注意的是Java(App) framework层的Binder是建立在Native层架构基础之上的,核心逻辑都是交予Native层方法来处理。

 

        图中红色代表整个Java(App) frameworkbinder架构相关组件;Binder类代表Server端,BinderProxy类代表Client端;

    图中蓝色代表NativeBinder架构相关组件;

        Java(App) framework层的Service Manager类与Native层的功能并不完全对应,java层的Service Manager类的实现最终是通过BinderProxy传递给Native层来完成的。


1.4 Binder类分层

        整个Binderkernel至,nativeJNIFramework层所涉及的类如下:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值