Android Camera进程间通信类总结
我们直达camera模块的代码根据层次可以分为下面几层,开发者直接接触的是Camera api的部分,Camera api会通过Binder IPC方式调用到Camera服务部分,但是这部分代码实在繁杂,需要将这部分IPC联系的方式总结一些,方便后来人方便的学习这一块的内容。
- Camera api部分:
frameworks/base/core/java/android/hardware/camera2- Camera JNI部分:
frameworks/base/core/jni/android_hardware_Camera.cpp
编译选项在目录下的Android.bp
make libandroid_runtime -j1- Camera UI库部分:
frameworks/av/camera/
编译选项在目录下的Android.bp
make libcamera_client -j1- Camera服务部分:
frameworks/av/services/camera/libcameraservice/
编译选项在目录下的Android.mk
make libcameraservice -j1- Camera HAL部分:
hardware/qcom/camera/
首先大家关注一下这个代码路径:frameworks/av/camera/aidl/ 这里是和cameraservice端交互的桥梁。

image.png
cameraservice端的代码在
frameworks/av/services/camera/libcameraservice/下面。
image.png
1.ICameraDeviceUser.aidl
这个aidl文件会自动生成:
./out/soong/.intermediates/frameworks/av/camera/libcamera_client/android_arm_armv7-a-neon_core_shared_platform/gen/aidl/android/hardware/camera2/ICameraDeviceUser.h
#ifndef AIDL_GENERATED_ANDROID_HARDWARE_CAMERA2_I_CAMERA_DEVICE_USER_H_
#define AIDL_GENERATED_ANDROID_HARDWARE_CAMERA2_I_CAMERA_DEVICE_USER_H_
#include <binder/IBinder.h>
#include <binder/IInterface.h>
#include <binder/Status.h>
#include <camera/CameraMetadata.h>
#include <camera/camera2/CaptureRequest.h>
#include <camera/camera2/OutputConfiguration.h>
#include <camera/camera2/SubmitInfo.h>
#include <cstdint>
#include <gui/view/Surface.h>
#include <utils/StrongPointer.h>
#include <vector>
namespace android {
namespace hardware {
namespace camera2 {
class ICameraDeviceUser : public ::android::IInterface {
public:
DECLARE_META_INTERFACE(CameraDeviceUser)
enum : int32_t {
NO_IN_FLIGHT_REPEATING_FRAMES = -1,
NORMAL_MODE = 0,
CONSTRAINED_HIGH_SPEED_MODE = 1,
VENDOR_MODE_START = 32768,
TEMPLATE_PREVIEW = 1,
TEMPLATE_STILL_CAPTURE = 2,
TEMPLATE_RECORD = 3,
TEMPLATE_VIDEO_SNAPSHOT = 4,
TEMPLATE_ZERO_SHUTTER_LAG = 5,
TEMPLATE_MANUAL = 6,
};
virtual ::android::binder::Status disconnect() = 0;
virtual ::android::binder::Status submitRequest(const ::android::hardware::camera2::CaptureRequest& request, bool streaming, ::android::hardware::camera2::utils::SubmitInfo* _aidl_return) = 0;
virtual ::android::binder::Status submitRequestList(const ::std::vector<::android::hardware::camera2::CaptureRequest>& requestList, bool streaming, ::android::hardware::camera2::utils::SubmitInfo* _aidl_return) = 0;
virtual ::android::binder::Status cancelRequest(int32_t requestId, int64_t* _aidl_return) = 0;
virtual ::android::binder::Status beginConfigure() = 0;
virtual ::android::binder::Status endConfigure(int32_t operatingMode, const ::android::hardware::camera2::impl::CameraMetadataNative& sessionParams) = 0;
virtual ::android::binder::Status deleteStream(int32_t streamId) = 0;
virtual ::android::binder::Status createStream(const ::android::hardware::camera2::params::OutputConfiguration& outputConfiguration, int32_t* _aidl_return) = 0;
virtual ::android::binder::Status createInputStream(int32_t width, int32_t height, int32_t format, int32_t* _aidl_return) = 0;
virtual ::android::binder::Status getInputSurface(::android::view::Surface* _aidl_return) = 0;
virtual ::android::binder::Status createDefaultRequest(int32_t templateId, ::android::hardware::camera2::impl::CameraMetadataNative* _aidl_return) = 0;
virtual ::android::binder::Status getCameraInfo(::android::hardware::camera2::impl::CameraMetadataNative* _aidl_return) = 0;
virtual ::android::binder::Status waitUntilIdle() = 0;
virtual ::android::binder::Status flush(int64_t* _aidl_return) = 0;
virtual ::android::binder::Status prepare(int32_t streamId) = 0;
virtual ::android::binder::Status tearDown(int32_t streamId) = 0;
virtual ::android::binder::Status prepare2(int32_t maxCount, int32_t streamId) = 0;
virtual ::android::binder::Status updateOutputConfiguration(int32_t streamId, const ::android::hardware::camera2::params::OutputConfiguration& outputConfiguration) = 0;
virtual ::android::binder::Status finalizeOutputConfigurations(int32_t streamId, const ::android::hardware::camera2::params::OutputConfiguration& outputConfiguration) = 0;
enum Call {
DISCONNECT = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
SUBMITREQUEST = ::android::IBinder::FIRST_CALL_TRANSACTION + 1,
SUBMITREQUESTLIST = ::android::IBinder::FIRST_CALL_TRANSACTION + 2,
CANCELREQUEST = ::android::IBinder::FIRST_CALL_TRANSACTION + 3,
BEGINCONFIGURE = ::android::IBinder::FIRST_CALL_TRANSACTION + 4,
ENDCONFIGURE = ::android::IBinder::FIRST_CALL_TRANSACTION + 5,
DELETESTREAM = ::android::IBinder::FIRST_CALL_TRANSACTION + 6,
CREATESTREAM = ::android::IBinder::FIRST_CALL_TRANSACTION + 7,
CREATEINPUTSTREAM = ::android::IBinder::FIRST_CALL_TRANSACTION + 8,
GETINPUTSURFACE = ::android::IBinder::FIRST_CALL_TRANSACTION + 9,
CREATEDEFAULTREQUEST = ::android::IBinder::FIRST_CALL_TRANSACTION + 10,
GETCAMERAINFO = ::android::IBinder::FIRST_CALL_TRANSACTION + 11,
WAITUNTILIDLE = ::android::IBinder::FIRST_CALL_TRANSACTION + 12,
FLUSH = ::android::IBinder::FIRST_CALL_TRANSACTION + 13,
PREPARE = ::android::IBinder::FIRST_CALL_TRANSACTION + 14,
TEARDOWN = ::android::IBinder::FIRST_CALL_TRANSACTION + 15,
PREPARE2 = ::android::IBinder::FIRST_CALL_TRANSACTION + 16,
UPDATEOUTPUTCONFIGURATION = ::android::IBinder::FIRST_CALL_TRANSACTION + 17,
FINALIZEOUTPUTCONFIGURATIONS = ::android::IBinder::FIRST_CALL_TRANSACTION + 18,
};
}; // class ICameraDeviceUser
class ICameraDeviceUserDefault : public ICameraDeviceUser {
public:
::android::IBinder* onAsBinder() override;
::android::binder::Status disconnect() override;
::android::binder::Status submitRequest(const ::android::hardware::camera2::CaptureRequest& request, bool streaming, ::android::hardware::camera2::utils::SubmitInfo* _aidl_return) override;
::android::binder::Status submitRequestList(const ::std::vector<::android::hardware::camera2::CaptureRequest>& requestList, bool streaming, ::android::hardware::camera2::utils::SubmitInfo* _aidl_return) override;
::android::binder::Status cancelRequest(int32_t requestId, int64_t* _aidl_return) override;
::android::binder::Status beginConfigure() override;
::android::binder::Status endConfigure(int32_t operatingMode, const ::android::hardware::camera2::impl::CameraMetadataNative& sessionParams) override;
::android::binder::Status deleteStream(int32_t streamId) override;
::android::binder::Status createStream