註冊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函數: