從 MediaService入手
1 首先創(chuàng)建一個ProcessState對象 打開一個binder設(shè)備fd 映射一塊共享內(nèi)存
2 獲取 IServerManager 業(yè)務(wù)對象 包括如下操作
∠蛲肌(1)創(chuàng)建BpBinder對象 設(shè)置handle對象為0(handle值是找到對端的憑證)
(2) 創(chuàng)建一個BpServerManager對象术荤,該對象定義了ServerManager業(yè)務(wù)接口,并且持有一個成員變量 mRemote為剛才創(chuàng)建的BpBinder對象
3 通信: 創(chuàng)建一個IPCThreadState對象 該對象是線程綁定的疯汁,其中包含發(fā)送緩沖對象和接受緩沖對象项戴,要想和對端通信(也就是和BpBinder對應(yīng)的handle的BnBinder通信)調(diào)用BpServerManager的業(yè)務(wù)接口,轉(zhuǎn)而調(diào)用BpBinder的transact方法,轉(zhuǎn)而調(diào)用該線程綁定的IPCThreadState函數(shù)玻粪,并傳遞handle進(jìn)行向?qū)Χ税l(fā)送數(shù)據(jù)(向共享內(nèi)存中寫數(shù)據(jù)) 收到對方返回數(shù)據(jù) 每個線程總都有一個發(fā)送緩沖區(qū)和接收緩沖區(qū),所以是線程安全的诬垂,具體Binder設(shè)備如何保證多個線程的安全劲室,這個需要研究Binder驅(qū)動(類似將共享內(nèi)存的同步邏輯封裝到驅(qū)動中,而不是通信進(jìn)程自行解決)
4 IServiceManager 所調(diào)用的所有接口都是向遠(yuǎn)端發(fā)送Binder數(shù)據(jù)
服務(wù)端ServiceManager? 代碼很簡單结窘,就是打開Binder設(shè)備得到fd很洋,映射內(nèi)存,死循環(huán) 阻塞等待對端請求到來隧枫,處理請求喉磁,寫會結(jié)果
服務(wù)端代碼
BnBinder 有個onTransact函數(shù) 客戶端BBService 繼承BnBinder 和IService接口谓苟,當(dāng)調(diào)用onTransact的時候會根據(jù)請求碼選擇調(diào)用IService的具體方法,然后把執(zhí)行結(jié)果返回給對端
可見 Binder 通信是由 handler控制的 沒有服務(wù)端也是可以互相通信的 是無連接的 ServerManager起到連接作用