Binder浅析原理(正确学习Binder方法)

发布于:2023-01-14 ⋅ 阅读:(638) ⋅ 点赞:(0)

简介

Binder是安卓中实现IPC(进程间通信的)常用手段,四大组件之间的跨进程通信也是利用Binder实现的,Binder是学习四大组件工作原理的的一个重要基础。

  • 从功能上讲:Binder是一种在Android设备上进行IPC(Inter-Process Communication,进程间通信)的主要方式,主要用来实现跨进程通信。
  • 代码上讲:Binder是一个类,实现了IBinder接口。
  • 从Android Framwork角度来讲:Binder是ServerManager连接各种Manager和ManagerService的桥梁。

Binder

IPC原理

从进程角度来看IPC机制

binder_interprocess_communication

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

Binder原理

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

ServiceManager

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

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

  1. 注册服务(addService):Server进程要先注册Service到ServiceManager。该过程:Server是客户端,ServiceManager是服务端。
  2. 获取服务(getService):Client进程使用某个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通信。

C/S模式

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

Binder关系图

  • client端:BpBinder.transact()来发送事务请求;
  • server端:BBinder.onTransact()会接收到相应事务。

源码

从上之下, 整个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)

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 (核心类)

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

Kernel

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

Binder 的完整定义

现在我们可以对 Binder 做个更加全面的定义了:

  1. 从进程间通信的角度看,Binder 是一种进程间通信的机制;
  2. 从 Server 进程的角度看,Binder 指的是 Server中的 Binder 实体对象;
  3. 从 Client 进程的角度看,Binder 指的是对 Binder代理对象,是 Binder 实体对象的一个远程代理
  4. 从传输过程的角度看,Binder 是一个可以跨进程传输的对象;Binder驱动会对这个跨越进程边界的对象对一点点特殊处理,自动完成代理对象和本地对象之间的转换。

一般Android应用开发很少直接用到跨进程信通信(IPC),但如果你想知道:

  • 1.App是如何启动并初始化的?
  • 2.Activity的启动过程是怎样的?
  • 3.进程间是如何通信的?
  • 4.AIDL的具体原理是什么?
  • 5.众多插件化框架的设计原理等等。

这些问题的背后都与 Binder 有莫大的关系,要弄懂上面这些问题理解 Bidner 通信机制是必须的。

本文主要讲解了 Binder 的主要原理,向更深入学习 Binder 需要寻找很多的学习资料辅助,我再这里推荐网上整合的一套《 Binder 学习手册》。鉴于出自大佬之手,可以帮助到大家,少走些弯路在里面。资料放在上方需要可以获取哦!~
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到