1.整體介紹
Android Camera框架從總體上看是一個client/service架構。有兩個進程,一個是client進程,能夠當作AP端
,主要包括Java代碼和一些native層的c/c++代碼;另外一個是service進程,屬於服務端,是native c/c++代碼,
主要負責和linux kernel中的camera driver交互,蒐集linux kernel中driver層傳上來的數據,並交給顯示系統(surface)顯示。client 和 service 進程經過Binder機制進行通訊,client端經過調用service端的接口實現各個具體的功能。
對於preview數據不會經過Binder機制從service端copy 到client端,但會經過回調函數與消息機制將preview數據的buffer地址傳到client端,最終可在Java ap中操做處理preview數據。java
2.調用層次劃分linux
Package -> Framework -> JNI ->Camera.cpp -- (binder) ->CameraService ->Camera HAL -> Qcom ->Camera Driverandroid
client端:
Package 中的 camera.java 調用Framework中的 camera.java(framework/base/core/java/android/hardware).
Framework中的 camera.java 調用 JNI層的native 函數。JNI層的調用實如今android_hardware_camera.cpp(framework/base/core/jni文件下的文件都被 編譯進libandroid_runtime.so)文件中,android_hardware_camera.cpp文件中的 register_android_hardware_camera(JNIEnv *env)函數會將native函數註冊到虛擬機中,以供framework層的JAVA代碼調用,這些native函數經過調用 libcamera_client.so中的camera類實現具體功能。c++
核心的libcamera_client.so動態庫源代碼位於:framework/base/core/av中,其中 Icamera,IcameraClient,IcameraService三個類按照Binder IPC通訊要求的框架實現的,用來與service端通訊。CameraParameters類接受framework層的 android.hardware.camera::Parameters類爲參數。架構
service端:
service端的實如今動態庫libcameraservice.so中,源代碼位於:frameworks/av/services/camera。
CameraService:Client類經過調用Camera HAL層來實現具體的功能。框架
Camera Service 在系統啓動時new了一個實例額,以「media.camera」註冊到servicemanager中。在init.rc中啓動多媒體服務進程。函數
CameraHAL層:
libcameraservice.so::CameraService::Client類調用camera HAL 的代碼實現具體功能。
JAVA Ap中的功能調用最終會調用到HAL層,HAL層經過startpreview 掉到hardware/qcom/camera中的start_preview.而後就是高通這一層對底層驅動上來的數據作一些處理。從linux kernel中的camera driver獲得preview數據。而後交個surface顯示或者保存到文件。接口