2.2Camera open在Framework中的過程

在前面的內容中,我們提到過CameraManager類的主要用途是open cam­era,這一節我們將詳細梳理這一過程在Framework中的類和邏輯。

SDK提供的方法最終調用openCameraDeviceUserAsync方法,通過觀察我們可以知道最核心的代碼只有兩行,

其中第一句獲取了CameraService對象,隨後調用了它的connectDevice方法,並返回了一個ICameraDeviceUser對象

我們來逐行分析:

ICameraService是一個AIDL,實現是/frameworks/av/service-s/camera/libcameraservice/CameraService.cpp,觀察這個類提供的方法,可以總結爲兩大類:第一類鏈接相關的connect、disconnect、dump、block、finish等方法,第二類是設備的狀態、特徵、參數、監聽的get、set、remove、update、add等操作方法。這些方法就代表了CameraService的主要功能是設備的鏈接和操作。

ICameraService的對象是通過CameraManagerGlobal類獲取的,這個類是CameraManager的一個內部類,實現了單例模式,通過get方法獲取實例,調用getCameraService()方法獲取CameraService。在上一節中我們已經分析過CameraService的啓動過程,知道系統啓動後CameraService就已經啓動了。這裏通過“media.camera”的binder機制獲取cameraService。這裏完成了從應用進程到CameraService的進程通信。ICameraService是一個AIDL,它的實現在/frameworks/av/services/camera/libcameraser-vice/CameraService.cpp中,包括supportsCamera2ApiLocked方法connectDevice方法,我們稍後再講。

在進行了Service的非空判斷之後,就調用了cameraService的connectDevice方法,並返回cameraUser對象。這裏我們逐一分析涉及到的每個類。

首先來看代碼:

圖 1 openCameraDeviceUserAsync()方法部分代碼

CameraUser是一個ICameraDeviceUser的實例,我們已經講過Framework中I開頭的類一般都是AIDL機制的組成。所以在CameraService進程的一頭有一個實現類BnCameraDeviceUser,被CameraDeviceClientBase繼承,最終被CameraDeviceClent繼承。這個類主要定義的是request和stream的操作方法。

接下來是connectDevice方法的第一個參數callback,是ICameraDeviceCallBacks類型,通過調用deviceImpl的get方法獲取,查看代碼可以看到這個Callback只是在ICameraDeviceCallbacks中做了創建對象的操作。這個類對應的實現是BnCameraDeviceCallbacks,被ServiceCallback繼承,主要是Device的一些狀態的回調。

CameraDevice類是一個抽象類,它的實現類是CameraDeviceImpl。因此這個類的行爲與CameraDevice是一致的,主要是創建Session,監聽狀態,當然功能更多一些。我們看到openCameraDeviceUserAsync方法傳入的參數實際上都用於創建deviceImpl對象。

方法的最後deviceImpl調用setRemoteDevice方法傳入了cameraUser對象,在這個方法裏cameraUser作爲參數用於創建ICameraDeviceUserWrapper對象。這個類通過名字,我們可以知道是ICameraDeviceUser的包裝類,類中的全部方法都做了異常處理的cameraUser的方法調用。

之後通過AIDL連接CameraDeviceClient,確保設備狀態無異常後,異步調用CameraDevice.StateCallback的onOpened方法和繼承了CameraDevice.StateCallback的靜態內部抽象類StateCallbackKK的onUnconfigured方法。

這個mRemoteDevice就是應用進程與camera service之間的橋樑,通過mRemoteDevice操作service的方法,最終實現Camera底層操作。

到這裏Framework的open camera操作就已經完成了,繼續深入將是provider的內容,我們會在以後的章節中進行分析。在這一章節中,我們還留下了幾個尾巴,例如connectDevice方法到底發生了什麼,爲何筆者始終沒有提及getCameraCharacteristics方法。應用傳入的callback到底是怎樣被調用的等等,這些細節我們將在之後的內容逐一揭示。

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