Android Camera框架分析


(該圖轉自他人,源作者不詳)
該圖很清晰的說明了Camera啓動時從上到下的調用過程。
ICameraClient/ICameraSerice/ICamera是接口類,其功能真正實現是在繼承了BnCamera*的Camera*中,而BpCamera*對象是在遠程端用Binder來和Camera*對象通信的。

第四步比較複雜,解釋如下:
init.rc腳本會加載mediaserver,mediaserver中會創建CameraService。
getCameraService時會創建sp<ICameraService>類型,其實就是在CameraClient端創建CameraService的proxy,創建sp強引用類型會調用CameraService::onFirstRef->hw_get_module
->hw_get_module_by_class(class_id:a string “Camera” orother name):
It will search variant_keys[i].camera.so in HAL_LIBRARY_PATH, then load(dlopen) it, and set hw_module_t.
static const char *variant_keys[] = {"ro.hardware", "ro.product.board","ro.board.platform","ro.arch"};
從以上看出在getCameraService時會加載板子支持的Camera lib

c->mCamera = cs->connect,是BpCameraService->Connect,在其內部會創建BpCamera,BpCamera由CameraService的內部類Client來繼承並實現;下面再說Client。
BpCameraService->Connect中同樣會通過binder機制調用BnCameraService->Connect其是虛函數,最終會調用BnCameraService的真正實現CameraService->connect,connect裏會new client,並將該client的proxy返回給c->mCamera,而在構造Client時會使用創建CameraSerice時得到的hw_module_t來get_camera_info,並new CameraHardwareInterface,initialize(真正openhardware),因此說CameraService中的Client對象真正實現了camera需要和HAL打交道到部分。

通過以上步驟,CameraClient就真正和Client(真正實現了camera需要和HAL打交道到部分)端聯繫起來了

哇哦,好拐!別把CameraClient和Client搞混。
總結:
1. 系統啓動創建CameraService
2. 啓動camera時創建CameraClient(即Camera的實例)
3. getCameraServiceCameraClient取得CameraService的proxy
4. 創建sp<CameraService>時會調用onFirstRef->hw_get_module->hw_get_module_by_class,來加載Camera Library取得hw_module_t
5. CameraService通過connect, 首先會取得CameraClient的proxy(),保存mCameraClient,然後根據CameraID之前取得的結構體hw_module_t調用libraryt創建CameraHardwareInterface,並initialize(open hardware),再用hardware這個參數new其對應的Client,每個Client對應一個真實sensor
6. CameraClient通過cs->Connect會取得Client的proxy
7. 上層CameraClient會通過Client的proxy來執行StartPreview等各種動作,Client會通過CameraClient的proxy來handlePreviewData等

下圖是參考Camera爲另一個項目畫的各層類的繼承關係圖,將WaveManager改爲Camera,該圖即爲Camera各層類的繼承和通信關係
紅色雙箭頭表示Binder通信,黑色箭頭表示繼承自,綠色箭頭表示持有。


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