一次完整的IPC通信流程是怎样的?
了解binder的整体架构原理:binder的分层架构
了解应用和binder驱动的交互方式:1. client端和binder驱动的交互方式, 2. server端和binder驱动的交互方式
了解IPC过程中的通信协议
角色纬度:Client,Server,binder驱动
分层纬度:应用层,framework层(java层和native层),驱动层
binder对象纬度:代理端(Client端),实体端(Server端)
Client端
mRemote:BinderProxy对象
transactNative:native函数
BinderProxy.transact 在native层的实现
target:BpBinder对象
IPCThreadState::self(): 线程内的单例,每个线程有一个IPCThreadState对象
mHandle:代表哪个binder引用,与驱动交互时用
IPCThreadState里有两个parcel:mIn(mIn.read: 从binder驱动读)和mOut(mOut.write: 往binder驱动写)
talkWithDriver: 与驱动通信,把mOut里的数据写入驱动(或将mIn里的数据读出来)
BR_TRANSACTION_COMPLETE: 驱动已经收到client端的transact请求
BR_REPLY: 驱动已经收到Server端的reply
ioctl:系统调用
ioctl在驱动层的实现
Server端(通过binder线程与binder驱动交互)
IPCThreadState::self()->JoinThreadPool(mlsMain): 把线程注册到binder驱动,这样就成为一个binder线程了
Client向Server发起请求时,CLient向Binder驱动写入BC_TRNSACTION指令,Binder驱动收到后返回Client一个BR_TRANSACTION_COMPLETE回执,回执发完后,Binder驱动通过BR_TRANSACTION将这个请求转发给Server,Server收到后去处理这个请求,处理完后,向binder驱动写BC_REPLY指令回执,Binder驱动收到BC_REPLY后返回Server一个BR_TRANSACTION_COMPLETE回执,然后binder驱动通过指令BC_REPLY将结果转发给Client
Client发起请求后:休眠
Server 端的binder线程处理请求之外:休眠