Java層 :Frameworks\base\core\java\android\hardware\Camera.java
JNI: Frameworks\base\core\jni\android_hardware_Camera.cpp
C++: Frameworks\av\include,Frameworks\av\camera,Frameworks\av\services\camera
第一部分, 也即第一組binder;PS:這裏發起連接,獲取具體模組的代理,在App進程
ICameraClient, 對應的代理類爲BpCameraClient, 對應的服務類爲BnCameraClient(抽象類), Camera(具體的實現類),另外 Camera還有一個父類BaseCamera
用於發送連接請求,接收回調
第二部分, 也即第二組Binder; PS:這裏只是用來選擇、管理模組,而且在服務進程
ICameraService, 對應的代理類爲BpCameraService, 對應的服務類爲 抽象類BnCameraService, 實現類CameraService
用於接收請求,管理ICamera
第三部分,也即第三組Binder;PS:這裏對應Device 即具體模組,在服務進程
ICamera, 對應的代理類爲BpCamera,對應的服務類 抽象類爲BnCamera, 實現類爲Client, 其同時也繼承BasicClient, 而且有子類CameraClient, Camera2Client
用於管理具體的攝像頭模組
調用邏輯Camera.java 經過 JNI android_hardware_Camera 建立c++ 層Camera對象, 在BaseCamera中獲取ICameraServcie的代理(這個Binder服務已經註冊到ServiceManager,能夠經過名稱獲取),經過ICameraService代理向CameraService發起連接請求而且將ICameraClient 做爲回調發送到CameraService, 收到請求以後,CameraService 會根據系統版本選擇new CameraClient 或者 Camera2Client ,而且將ICameraClient 傳入Client中;即每個CameraClient 都有一個對應的回調。而後發起連接的BaseCamera 從reply中讀取出ICamera的代理BpCamera。最後就能夠經過BpCamera 控制攝像頭的預覽拍照等功能。