1. 程式人生 > >Android camera framework7.0和6.0 主要差異

Android camera framework7.0和6.0 主要差異

目前差異主要體現在介面封裝和程序分離方面。

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程序中