《Android Binder-原理概述》

  • 概述 

        Android系统中,每个应用程序是由Android的 Activity, Service, Broadcast, ContentProvider 这四大组件中的一个或者多个组合而成,四大组件涉及进程间的通信底层都是依赖于 Binder IPC 机制。例如当进程 A 中的 Activity 要向进程 B 中的 Service 通信,这便需要依赖于 Binder IPC。不仅于此,整个 Android 系统架构中,大量采用了 Binder 机制作为 IPC (进程间通信)方案,当然也存在部分其他的 IPC 方式,比如 Zygote 通信便是采用 socket。

  • Binder

    1. IPC原理

        从进程角度来看 IPC 进程

        

       每个 Android 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个 4GB 的虚拟地址空间,其中 3GB 是用户空间,1 GB的内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间确是可共享的的。Client 进程向 Service 进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与 Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。

    2. Binder原理

       Binder通信采用 C/S 架构,从组件视觉来说,包含 Client、Server、ServiceManager 以及 binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。架构图如下所示:

ServiceManager

       可以看出无论是注册服务和获取服务的过程都需要 ServeiceManager,需要注意的是此处的 ServiceManager 是指 Native 层的 ServiceManager(C++),并非指 framwork 层的 ServiceManager(Java)。ServiceManager 是整个 Binder 通信机制的大管家,是 Android 进程通信机制 Binder 的守护进程,要掌握 Binder 机制,首先需要了解系统如何首次启动Service Manager。当 Service Manager 启动后,Client 端和 Service 端通信时都需要先获取 Service Manager 接口,才能开始通信服务。

       图中 Client/Service/ServiceManager 之间的相互通信都基于 Binder 机制。既然基于 Binder 机制通信,那么同样也是 C/S 架构,则图中的3大步骤都有相应的 Client 端与 Server端。

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

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

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

       图中的 Client,Server,Service Manager 之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与 Binder驱动进行交互的,从而实现 IPC 通信方式。其中 Binder 驱动位于内核空间,Client,Server,Service Manager 位于用户空间。Binder 驱动和 Service Manager 可以看做是 Android 平台的基础框架,而 Client 和 Server 是 Android 的应用层,开发人员只需自定义实现 Client、Server 端,借助 Android 的基础平台框架便可以直接进行 IPC 通信。

3. C/S 模式

       BpBinder(客户端)和 BBinder(服务端)都是 Android 中 Binder 通信相关的代表,它们都从 IBinder 类中派生而来,关系图如下:

       

       1)Client 端:BpBinder.transact() 来发送事务请求;

       2)Server端:BBinder.onTransact() 会接收到相应事务。

  • 学习提纲

       1)注册服务、获取服务;

       2)启动 Service Manager、获取 Service Manager;

       3)认识 Binder Driver;

       4)framework 层分析

       5)使用 Binder;

       6)使用 AIDL;

       7)Binder 总结。

  • 源码目录

       从上之下,整个 Binder 架构所涉及的总共有以下5个目录:

/framework/base/core/java/               (Java)
/framework/base/core/jni/                (JNI)
/framework/native/libs/binder            (Native)
/framework/native/cmds/servicemanager/   (Native)
/kernel/drivers/staging/android          (Driver)

       1)Java framework

/framework/base/core/java/android/os/  
    - IInterface.java
    - IBinder.java
    - Parcel.java
    - IServiceManager.java
    - ServiceManager.java
    - ServiceManagerNative.java
    - Binder.java  

/framework/base/core/jni/    
    - android_os_Parcel.cpp
    - AndroidRuntime.cpp
    - android_util_Binder.cpp (核心类)

       2) Native framework

/framework/native/libs/binder         
    - IServiceManager.cpp
    - BpBinder.cpp
    - Binder.cpp
    - IPCThreadState.cpp (核心类)
    - ProcessState.cpp  (核心类)

/framework/native/include/binder/
    - IServiceManager.h
    - IInterface.h

/framework/native/cmds/servicemanager/
    - service_manager.c
    - binder.c

       3) Kernel

/kernel/drivers/staging/android/
    - binder.c
    - uapi/binder.h

参考:Binder系列—开篇 - Gityuan博客 | 袁辉辉的技术博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值