Binder通訊原理簡介圖
本文基於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