感兴趣可以加QQ群85486140,大家一起交流相互学习下!
目前差异主要体现在接口封装和进程分离方面。
###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进程中