Android camera framework7.0和6.0 主要差异

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/armwind/article/details/78321247

目前差异主要体现在接口封装和进程分离方面。

1.代码结构

1).android6.0代码

  目前Android6.0的代码,本地没有源代码,这里就拿服务器上版本了。可以发现在Android6.0上,接口都是在native层以源码方式实现了。由于以I开头的文件都具有binder通信作用。所以在android7.0中,这些接口都以aidl文件来描述,不过它们本质上没什么区别,用起来都是一样的。

Android.mk                          07-Jan-2016 1.5 KiB
Camera.cpp                          07-Jan-2016 9.7 KiB
camera2/                            07-Jan-2016 4 KiB
CameraBase.cpp                      07-Jan-2016 6.7 KiB
CameraMetadata.cpp                  07-Jan-2016 21.6 KiB
CameraParameters.cpp                07-Jan-2016 19.1 KiB
CameraParameters2.cpp               07-Jan-2016 9.9 KiB
CameraUtils.cpp                     07-Jan-2016 4.1 KiB
CaptureResult.cpp                   07-Jan-2016 3.3 KiB
ICamera.cpp                         07-Jan-2016 13.8 KiB
ICameraClient.cpp                   07-Jan-2016 4.7 KiB
ICameraRecordingProxy.cpp           07-Jan-2016 3.5 KiB
ICameraRecordingProxyListener.cpp   07-Jan-2016 2.6 KiB
ICameraService.cpp                  07-Jan-2016 19.3 KiB
ICameraServiceListener.cpp          07-Jan-2016 3.2 KiB
ICameraServiceProxy.cpp             07-Jan-2016 2.4 KiB
MODULE_LICENSE_APACHE2              07-Jan-2016 0
NOTICE                              07-Jan-2016 10.4 KiB
tests/                              07-Jan-2016 4 KiB
VendorTagDescriptor.cpp             07-Jan-2016 15.7 KiB

2).android7.0代码

  前面也提到过,7.0把具有binder通信的接口都用aidl文件来描述。那么这里会不会像java那边把aidl文件编译成.java文件,答案肯定是否定的。aidl由编译系统编译成cpp文件。

.
├── camera2
│   ├── CaptureRequest.aidl
│   ├── ICameraDeviceCallbacks.aidl
│   ├── ICameraDeviceUser.aidl
│   ├── impl
│   │   ├── CameraMetadataNative.aidl
│   │   └── CaptureResultExtras.aidl
│   ├── params
│   │   ├── OutputConfiguration.aidl
│   │   └── VendorTagDescriptor.aidl
│   └── utils
│       └── SubmitInfo.aidl
├── CameraInfo.aidl
├── ICamera.aidl
├── ICameraClient.aidl
├── ICameraService.aidl
├── ICameraServiceListener.aidl
└── ICameraServiceProxy.aidl

编译后的产物:

  • 1.头问件:
    路径:obj/SHARED_LIBRARIES/libcamera_client_intermediates/aidl-generated/include
.
└── android
    └── hardware
        ├── BnCameraService.h
        ├── BnCameraServiceListener.h
        ├── BpCameraService.h
        ├── BpCameraServiceListener.h
        ├── camera2
        │   ├── BnCameraDeviceCallbacks.h
        │   ├── BnCameraDeviceUser.h
        │   ├── BpCameraDeviceCallbacks.h
        │   ├── BpCameraDeviceUser.h
        │   ├── ICameraDeviceCallbacks.h
        │   └── ICameraDeviceUser.h
        ├── ICameraService.h
        └── ICameraServiceListener.h
  • 2.源文件:
    路径:obj/SHARED_LIBRARIES/libcamera_client_intermediates/aidl-generated/src
./src/
└── aidl
    └── android
        └── hardware
            ├── camera2
            │   ├── ICameraDeviceCallbacks.cpp
            │   └── ICameraDeviceUser.cpp
            ├── ICameraService.cpp
            └── ICameraServiceListener.cpp

3).文件对比事例

  • android6.0
    这里以ICameraDeviceCallbacks.h为例子,android6.0下面的的实现如下,其中接口类已经定死了。用户是不能改动的,客户端和服务端都需要实现相应的接口。
#ifndef ANDROID_HARDWARE_PHOTOGRAPHY_CALLBACKS_H
#define ANDROID_HARDWARE_PHOTOGRAPHY_CALLBACKS_H

#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <binder/IMemory.h>
#include <utils/Timers.h>
#include <system/camera.h>

#include <camera/CaptureResult.h>

namespace android {
class CameraMetadata;

class ICameraDeviceCallbacks : public IInterface
{
    /**
     * Keep up-to-date with ICameraDeviceCallbacks.aidl in frameworks/base
     */
public:
    DECLARE_META_INTERFACE(CameraDeviceCallbacks);

    /**
     * Error codes for CAMERA_MSG_ERROR
     */
    enum CameraErrorCode {
        ERROR_CAMERA_INVALID_ERROR = -1, // To indicate all invalid error codes
        ERROR_CAMERA_DISCONNECTED = 0,
        ERROR_CAMERA_DEVICE = 1,
        ERROR_CAMERA_SERVICE = 2,
        ERROR_CAMERA_REQUEST = 3,
        ERROR_CAMERA_RESULT = 4,
        ERROR_CAMERA_BUFFER = 5,
    };

    // One way
    virtual void            onDeviceError(CameraErrorCode errorCode,
                                          const CaptureResultExtras& resultExtras) = 0;
    // One way
    virtual void            onDeviceIdle() = 0;

    // One way
    virtual void            onCaptureStarted(const CaptureResultExtras& resultExtras,
                                             int64_t timestamp) = 0;
    // One way
    virtual void            onResultReceived(const CameraMetadata& metadata,
                                             const CaptureResultExtras& resultExtras) = 0;
    // One way
    virtual void            onPrepared(int streamId) = 0;
};

// ----------------------------------------------------------------------------

class BnCameraDeviceCallbacks : public BnInterface<ICameraDeviceCallbacks>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

}; // namespace android

#endif
  • android7.0
    对比上面的android6.0的代码可以发现,接口都是一样的。客户端和服务端的头文件分别也都是一样的,只不过表现形式不一样而已。
#ifndef AIDL_GENERATED_ANDROID_HARDWARE_CAMERA2_I_CAMERA_DEVICE_CALLBACKS_H_
#define AIDL_GENERATED_ANDROID_HARDWARE_CAMERA2_I_CAMERA_DEVICE_CALLBACKS_H_

#include <binder/IBinder.h>
#include <binder/IInterface.h>
#include <binder/Status.h>
#include <camera/CameraMetadata.h>
#include <camera/CaptureResult.h>
#include <cstdint>
#include <utils/StrongPointer.h>

namespace android {

namespace hardware {

namespace camera2 {

class ICameraDeviceCallbacks : public ::android::IInterface {
public:
DECLARE_META_INTERFACE(CameraDeviceCallbacks)
enum  : int32_t {
  ERROR_CAMERA_INVALID_ERROR = -1,
  ERROR_CAMERA_DISCONNECTED = 0,
  ERROR_CAMERA_DEVICE = 1,
  ERROR_CAMERA_SERVICE = 2,
  ERROR_CAMERA_REQUEST = 3,
  ERROR_CAMERA_RESULT = 4,
  ERROR_CAMERA_BUFFER = 5,
};
virtual ::android::binder::Status onDeviceError(int32_t errorCode, const ::android::hardware::camera2::impl::CaptureResultExtras& resultExtras) = 0;
virtual ::android::binder::Status onDeviceIdle() = 0;
virtual ::android::binder::Status onCaptureStarted(const ::android::hardware::camera2::impl::CaptureResultExtras& resultExtras, int64_t timestamp) = 0;
virtual ::android::binder::Status onResultReceived(const ::android::hardware::camera2::impl::CameraMetadataNative& result, const ::android::hardware::camera2::impl::CaptureResultExtras& resultExtras) = 0;
virtual ::android::binder::Status onPrepared(int32_t streamId) = 0;
virtual ::android::binder::Status onRepeatingRequestError(int64_t lastFrameNumber) = 0;
virtual ::android::binder::Status onRequestQueueEmpty() = 0;
enum Call {
  ONDEVICEERROR = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
  ONDEVICEIDLE = ::android::IBinder::FIRST_CALL_TRANSACTION + 1,
  ONCAPTURESTARTED = ::android::IBinder::FIRST_CALL_TRANSACTION + 2,
  ONRESULTRECEIVED = ::android::IBinder::FIRST_CALL_TRANSACTION + 3,
  ONPREPARED = ::android::IBinder::FIRST_CALL_TRANSACTION + 4,
  ONREPEATINGREQUESTERROR = ::android::IBinder::FIRST_CALL_TRANSACTION + 5,
  ONREQUESTQUEUEEMPTY = ::android::IBinder::FIRST_CALL_TRANSACTION + 6,
};
};  // class ICameraDeviceCallbacks

}  // namespace camera2

}  // namespace hardware

}  // namespace android

#endif  // AIDL_GENERATED_ANDROID_HARDWARE_CAMERA2_I_CAMERA_DEVICE_CALLBACKS_H_

小总结:上面对比例子,我只列出了接口类,没有列出客户端和服务端的接口。客户端实现虚方法与服务端进行binder通信,而服务端除了实现虚方法接口外,还要实现onTransact()方法,该方法调用由服务端实现的虚方法。

2.功能差异

  • 1)android6.0
    cameraService服务驻留在mediaserver进程中
  • 2)android7.0
    cameraServer单独成一个进程,暂时与mediaServer撇清关系了,cameraService服务驻留在cameraserver进程中

猜你喜欢

转载自blog.csdn.net/armwind/article/details/78321247