本文基于android7.1。
Binder的作用的是跨进程通信,提供进程间交换数据。当然也适用于同一个进程间通信。
大致流程:客户端打包数据------>框架------->服务端------->返回结果到框架------->客户端
理解Binder通信最重要的就是把业务层和框架分开,
业务层就是客户端和服务端约定的接口,
框架层用于传递打包(Parcel)后的业务层数据。
下图为了便于理解,省略掉其他相关类,如 IBinder, sp,Parcel等。
主要介绍框架相关的类:
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