Binder通信原理简介图


本文基于android7.1。

Binder的作用的是跨进程通信,提供进程间交换数据。当然也适用于同一个进程间通信。

大致流程:客户端打包数据------>框架------->服务端------->返回结果到框架------->客户端

Binder通信原理简介图


理解Binder通信最重要的就是把业务层和框架分开,

业务层就是客户端和服务端约定的接口,

框架层用于传递打包(Parcel)后的业务层数据。


下图为了便于理解,省略掉其他相关类,如 IBinder,  sp,Parcel等。

主要介绍框架相关的类:

Binder通信原理简介图


Binder通信采用C/S架构,上图左边部分是Client ,主要包含BpBiner.cpp和BinerProxy.java, 右边是Server端,主要包含BBinder.cpp,JavaBBiner和Binder.java


按实现语言分层为: 驱动,C++, JNI, JAVA

1.驱动层:创建了文件节点 /dev/binder ,实现了读写文件的对应函数

\LINUX\android\kernel\drivers\staging\android\binder.c


2. C++ : 其中ProcessState是进程内唯一,IPCThreadState封装了传送数据的外层协议解析

\LINUX\android\frameworks\native\libs\binder

IPCThreadState.cpp

ProcessState.cpp

BBinder.cpp

BpBinder.cpp


3. JNI:定义了gBinderOffsets(对应Binder.java),gBinderProxyOffsets(对应BinderProxy)等结构体,及JavaBBiner

\LINUX\android\frameworks\base\core\jni\android_util_Binder.cpp


4. JAVA:Binder.java用于服务端,BinderProxy.java用于客户端(定义在Binder.java).BinderProxy的对象生成是在JNI层的javaObjectForIBinder方法中,在jni中对应gBinderProxyOffsets

\LINUX\android\frameworks\base\core\java\android\os\Binder.java