Binder機制(2)

註冊MediaPlayerService

下面分析MediaPlayerService,代碼如下:


根據前面的分析可知,defaultServiceManager()實際返回的對象是BpServiceManager,它是IServiceManager的後代,代碼如下所示:



這裏addService函數中把請求數據打包爲data後,傳給了BpBinder的transact函數,就把通信的工作叫給了BpBinder了。


之前在BpBinder中找不到任何與Binder設備交互的地方,祕密在這個transact函數中,它的實現如下:


這裏遇見了IPCThreadState,它和Binder的通信有關,對其進行深入分析:

IPCThreadState的實現代碼在IPCThreadState.cpp中,如下所示:



接下來,轉向分析它的構造函數IPCThreadState(),如下所示:


每個線程都有一個IPCThreadState,每個IPCThreadState中都有一個mIn,一個mOut

其中,mIn是用來接收來自Binder設備的數據的,mOut則是用來存儲發往Binder設備的數據的。


傳輸工作是很辛苦的,我們剛纔看到BpBinder的transact調用了IPCThreadState的transact函數,這個函數實際完成了與Binder通信的工作,代碼如下所示:


多熟悉的流程: 先發數據,然後等結果。

不過我們有必要確認一下handle這個參數有什麼作用。先看writeTransactionData函數,實現如下:



現在已經把addService的請求信息寫道了mOut中了,接下來再看看發送請求和接收回復部分的實現,代碼在waitForReponse函數中。如下所示:


OK,我們已經發送了請求數據,假設馬上就收到了回覆,後續該怎麼處理?看看executeCommand函數,如下所示:





下面看下如何和binder設備交互。talkwithDriver函數:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章