一次完整的IPC通信流程是怎樣的踱启?
了解binder的整體架構(gòu)原理:binder的分層架構(gòu)
了解應(yīng)用和binder驅(qū)動(dòng)的交互方式:1. client端和binder驅(qū)動(dòng)的交互方式报账, 2. server端和binder驅(qū)動(dòng)的交互方式
了解IPC過(guò)程中的通信協(xié)議
角色緯度:Client研底,Server,binder驅(qū)動(dòng)
分層緯度:應(yīng)用層透罢,framework層(java層和native層)榜晦,驅(qū)動(dòng)層
binder對(duì)象緯度:代理端(Client端),實(shí)體端(Server端)
Client端
mRemote:BinderProxy對(duì)象
transactNative:native函數(shù)
BinderProxy.transact 在native層的實(shí)現(xiàn)
target:BpBinder對(duì)象
IPCThreadState::self():? 線(xiàn)程內(nèi)的單例琐凭,每個(gè)線(xiàn)程有一個(gè)IPCThreadState對(duì)象
mHandle:代表哪個(gè)binder引用芽隆,與驅(qū)動(dòng)交互時(shí)用
IPCThreadState里有兩個(gè)parcel:mIn(mIn.read: 從binder驅(qū)動(dòng)讀)和mOut(mOut.write: 往binder驅(qū)動(dòng)寫(xiě))
talkWithDriver: 與驅(qū)動(dòng)通信,把mOut里的數(shù)據(jù)寫(xiě)入驅(qū)動(dòng)(或?qū)In里的數(shù)據(jù)讀出來(lái))
BR_TRANSACTION_COMPLETE:????驅(qū)動(dòng)已經(jīng)收到client端的transact請(qǐng)求
BR_REPLY: 驅(qū)動(dòng)已經(jīng)收到Server端的reply
ioctl:系統(tǒng)調(diào)用
ioctl在驅(qū)動(dòng)層的實(shí)現(xiàn)
Server端(通過(guò)binder線(xiàn)程與binder驅(qū)動(dòng)交互)
IPCThreadState::self()->JoinThreadPool(mlsMain): 把線(xiàn)程注冊(cè)到binder驅(qū)動(dòng)统屈,這樣就成為一個(gè)binder線(xiàn)程了
Client向Server發(fā)起請(qǐng)求時(shí)胚吁,CLient向Binder驅(qū)動(dòng)寫(xiě)入BC_TRNSACTION指令,Binder驅(qū)動(dòng)收到后返回Client一個(gè)BR_TRANSACTION_COMPLETE回執(zhí)愁憔,回執(zhí)發(fā)完后腕扶,Binder驅(qū)動(dòng)通過(guò)BR_TRANSACTION將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給Server,Server收到后去處理這個(gè)請(qǐng)求吨掌,處理完后半抱,向binder驅(qū)動(dòng)寫(xiě)B(tài)C_REPLY指令回執(zhí),Binder驅(qū)動(dòng)收到BC_REPLY后返回Server一個(gè)BR_TRANSACTION_COMPLETE回執(zhí)膜宋,然后binder驅(qū)動(dòng)通過(guò)指令BC_REPLY將結(jié)果轉(zhuǎn)發(fā)給Client
Client發(fā)起請(qǐng)求后:休眠
Server 端的binder線(xiàn)程處理請(qǐng)求之外:休眠