Android camera framework7.0和6.0 主要差異
阿新 • • 發佈:2018-11-25
目前差異主要體現在介面封裝和程序分離方面。
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程序中