android框架揭祕之android中c++寫的服務筆記

本地系統服務都是使用本地系統服務框架實現的
RPC信息僅包括RPC代碼和RPC數據   + 目的信息handle和 binder協議即爲 ipc數據
客戶端 有服務接口    服務端不僅有服務接口還要服務實現
IPCThreadState位於ipc層
服務使用者->BpFooService.foo()->BpBinder.transact()->IPCThreadState.transact()->talkWithDriver();到驅動
                                 添加handle            添加binder協議
驅動向IPCThreadState.executeCommand()->BBinder.transact()->BBinder.onTransact();->BnFOOService.OnTransact();
        含有BR_TRANSACTION協議        RPC代碼和數據傳入    服務調用非基本函數, 重新定義了OnTransact函數


BBinder類負責接收RPC代碼和數據 BpBinder保存者目標服務的handle信息
IInterface類提供類型轉換的功能  BnInterface將服務類型轉換成IBinder類型  BPInterface將服務代理類轉換成IBinder類型
通過binder驅動傳遞binder對象時,必須實現類型轉換  Parcel類負責保存IPC數據
IAudioFlinger  中間介質繼承了IInterface        發起IInterface類中asBinder函數用來將服務接口類型轉換爲IBinder類型
        接收的一方asInterface函數將IBinder類型轉換爲服務接口類型
BnInterface和BpInterface類繼承了IAudioFlinger類 所以當調用onAsBinder 子類會被調用
        BnInterface返回的是類自身的地址  BpInterface返回mRemote


BpInterface類的onASBinder函數調用remote(),調用BpRefBase類的remote()返回mRemote
宏預處理  descriptor數據成員,asInterface()類型轉換函數  接收ibinder類型的參數將其轉換爲IAudioFlinger功能和asBinder函數正好相反,getInterfaceDescriptor();
        若傳遞過來的是BpBinder,則IBinder.queryLocalInterface返回null,將創建BpAudioFlinger
        若傳遞過來的是BnBinder,BnInterface實現了queryLocalInterface方法,
IAudioFlinger與Ibinder類型間進行類型轉換
BnAudioFlinger服務的stub類          Bn類採用onTransact()
        BnInterface雙繼承IAudioFlinger和IBiner 一個業務,一個負責通信.
最頂端的Ibinder 接收RPC代碼和數據調用transact().然後調用BnAudioFlinger類的onTransact() 處理RPC代碼
服務代理  interface_cast最後調用asInterface實現mRemote的引用  sm->getService獲取的就是Bpbinder引用對象
parcel  中的data作爲參數傳遞和mOut變量則相當於IPCThreadState的數據成員 BpBinder的transact(第一個是rpc代碼,第二個爲含有"包名+接口"的字符串和數據)然後調用IPCThreadState.transact(第一個參數是目的信息handle,第二個爲parcel)然後調用writeTransactionData(),該函數將創建binder_transaction_data.  上述的rpc代碼和數據存入data.ptr.buffer
parcel實例mOut並保存在binder_write_read中的write_buffer中
C++層的ServerManager
class BpServiceManager : public BpInterface<IServiceManager>
通過服務接口IServiceManager來進行通信的
        getService(服務名稱)返回一個指向BpBinder實例的指針
        addService(服務名稱,服務實例的指針)請求註冊服務  返回值表示請求註冊成功了沒
進程ProcessState 會擁有Binder Driver信息 通過ProcessState(單例)可防止在同一進程中重複生成BpBinder對象
        ProcessState的構造函數中 做兩件和BInder有關的事情 一件是獲取binder驅動的文件描述符,一件是初始化數據緩衝區
        Bpbinder defaultServiceManager()函數創建BpserviceManager(單例)
                supportsProcesses() 若mDriver大於0,返回true 即成功打開binder驅動
        BpBinder中有mHandle值和transact()函數
        生成BpServiceManager實例對象(構造函數傳入Bpbinder 被保存在mRemote中) mRemote是父類BpRefBase中的成員變量
服務註冊
        interfaceToken(android.0s.IserviceManager)   name(media.audio_flinger)
binder對象的序列化 flat_Binder_object  writeStrongBinder()函數轉化
生成BInder IPC數據是有IPCThreadState類完成的
        調用writeTransactionData函數創建binder_transaction_data數據結構 + binder協議 等於 binder IPC數據
/frameworks/base/libs/binder/Parcel.cpp
const uint8_t* Parcel::ipcData() const
{
    return mData;
}
size_t Parcel::ipcDataSize() const
{
    return (mDataSize > mDataPos ? mDataSize : mDataPos);
}
const size_t* Parcel::ipcObjects() const
{
    return mObjects;
}
size_t Parcel::ipcObjectsCount() const
{
    return mObjectsSize;
}
把RPC數據和RPC代碼+handle轉換爲binder_transaction_data(通過parcel.write寫入) 然後加上binder協議(parcel.writeInt32) 變爲了IPC數據
mData包括mObject  mData由接口名稱,服務名稱,服務實例的序列化數據結構flat_binder_object  以上在用戶空間地址中
binder驅動將其拷貝到接收端進程的mmap區域
然後在客戶端進程通過waitForResponse接收消息
        調用talkWithDriver()函數,將mout發送到binder驅動中,並將驅動接收到數據保存到mIn中
在處理接收到的數據時,將調用parcel的ipcSetDataReference函數
 binder_transaction_data的buffer中保存着Rpc數據
 AudioSystem對於與AudioFlinger




 Android系統中對設備節點的訪問權限,通常使用用戶ID或是組ID
 應用程序不能直接訪問surface,必須通過surfaceHolder




 遠程調用只看I開頭的就行了..h聲明方法..cpp實現遠程調用
 CameraHardWareInterface是抽象類,定義了一系列接口  每個device vendor都繼承實現了cameraHardwareInterface抽象類
 Camera類繼承了IcameraClient類,負責在應用程序與相機服務間傳遞binder rpc數據
 CameraService類繼承了ICameraService類,負責應用程序與相機服務間的連接
 CameraService::Client類繼承了ICamera類負責相機設備的設置,控制,以及處理來自相機設備的事件
CameraService::Client控制ICameraClient
Main_mediaserver.cpp (frameworks\base\media\mediaserver)
 CameraService::instantiate();
連接相機服務的過程
 native_setup(new WeakReference<Camera>(this));
        android_hardware_Camera_native_setup
                sp<Camera> camera = Camera::connect();
                到了camera.cpp中了
                        const sp<ICameraService>& cs = getCameraService();
                        c->mCamera = cs->connect(c);//sp<ICamera>         mCamera; 返回icameraClient
Bpcamera控制或設置相機設備,BpCameraClient傳遞相機設備事件
        CameraService調用openCameraHardWare 然後getParameters和setParameters用於初始化相機實例
        調用getPreviewHeap 建立進入預覽堆空間,以致於能註冊到SurfaceFlinger上面,爲了更好的顯示
        拍照的時候會先autofocus,聚焦成功後相機會發送CAMERA_MSG_FOCUS通知上層聚焦成功
拍照結束  結果通過cameraservice返回c->notifyCallback(CAMERA_MSG_SHUTTER, 0, 0); 遠程調用icameraclient,即camera.cpp中的notifyCallback 然後返回給上層
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章