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數據。
2.調用層次划分
Package -> Framework -> JNI ->Camera.cpp -- (binder) ->CameraService ->Camera HAL -> Qcom ->Camera Driver
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類實現具體功能。
核心的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顯示或者保存到文件。