Android之Camera服务分析
Android系统中Camera是作为mediaservice服务中的一项,在开机过程中启动的。
/frameworsk/base/media/mediaserver/main_mediaserver.cpp:
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
/frameworks/base/services/camera/libcameraservice/CameraService.cpp:
我们在CameraSerivce.cpp文件中并没找到CameraService::instantiate(),但是我们在CameraService.h文件中发现:CameraService同时继承于两个类:BinderService<CameaService> 和 BnCameraSerivce。
/frameworks/base/services/camera/libcameraservice/CameraSerivce.h:
class MemoryHeapBase; class MediaPlayer; class CameraHardwareInterface; class CameraService : public BinderService<CameraService>, public BnCameraService { class Client; friend class BinderService<CameraService>; public: static char const* getServiceName() { return "media.camera"; } CameraService(); virtual ~CameraService();
.............
};
我们找到CameraService的父类:BinderService<SERVICE>它是一个模板类,替换之后就是:
class BinderService<CameraService>
{
public:
static status_t publish() {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(String(CameraService::getServiceName()),
new CameraServiec());
}
static void instantiate() { publish(); }
}
所以CameraService::instantiate();最后调用的还是:sm->addService("media.camera", new CameraService());将自己加入到ServiceManager的服务链表中。
CameraService作为BnCameraService的实现类,在Binder通信机制中是最终调用到的函数的类。
class BnCameraService: public BnInterface<ICameraService> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); };
主要提供onTransact函数,作为Binder通信的服务端,处理来自BpCameraService发来的命令。
status_t BnCameraService::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case GET_NUMBER_OF_CAMERAS: { CHECK_INTERFACE(ICameraService, data, reply); reply->writeInt32(getNumberOfCameras()); return NO_ERROR; } break; case GET_CAMERA_INFO: { CHECK_INTERFACE(ICameraService, data, reply); CameraInfo cameraInfo; memset(&cameraInfo, 0, sizeof(cameraInfo)); status_t result = getCameraInfo(data.readInt32(), &cameraInfo); reply->writeInt32(cameraInfo.facing); reply->writeInt32(cameraInfo.orientation); reply->writeInt32(result); return NO_ERROR; } break; case CONNECT: { CHECK_INTERFACE(ICameraService, data, reply); sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder()); sp<ICamera> camera = connect(cameraClient, data.readInt32()); reply->writeStrongBinder(camera->asBinder()); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
注意onTransact()函数中调用的一些函数如:getNumOfCameras(), getCameraInfo(), connect()等,我们在BpCameraService和BnCameraService的父类ICameraService中声明为纯虚函数,在BpCameraService和CameraService中分别给出了实现,BpCameraService作为代理类,提供接口给客户端,真正实现在BnCameraService的子类CameraService中。
class ICameraService : public IInterface { public: enum { GET_NUMBER_OF_CAMERAS = IBinder::FIRST_CALL_TRANSACTION, GET_CAMERA_INFO, CONNECT }; public: DECLARE_META_INTERFACE(CameraService); virtual int32_t getNumberOfCameras() = 0; virtual status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) = 0; virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId) = 0; };
宏声明:DECLARE_META_INTERFACE(CameraService)替换之后就是声明一些函数:
static const android::Strin16 descriptor; static android::sp<ICameraService> asInterface(const android::sp<android::IBinder>& obj); virtual const android::String16& getInterfaceDescriptor() const; ICameraService(); virtual ICameraService();
宏实现:IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService")
static const android::Strin16 ICameraService::descriptor("android.hadrware.ICameraService"); static android::sp<ICameraService> ICameraServiec::asInterface(const android::sp<android::IBinder>& obj) { android::sp<ICameraService> intr; if ( obj != NULL) { intr = static_cast<ICameraService*>(obj->queryLocalInterface(ICameraService::descriptor).get()); if (intr == NULL){ intr = new BpCameraService(obj); } } return intr; } virtual const android::String16& ICameraService::getInterfaceDescriptor() const { return ICameraService::descriptor(); } ICameraService() {} virtual ICameraService() {}
BpCameraService 提供接口给客户端:
class BpCameraService: public BpInterface<ICameraService> { public: BpCameraService(const sp<IBinder>& impl) : BpInterface<ICameraService>(impl) { } // get number of cameras available virtual int32_t getNumberOfCameras() { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); return reply.readInt32(); } // get information about a camera virtual status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); data.writeInt32(cameraId); remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply); cameraInfo->facing = reply.readInt32(); cameraInfo->orientation = reply.readInt32(); return reply.readInt32(); } // connect to camera service virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); data.writeStrongBinder(cameraClient->asBinder()); data.writeInt32(cameraId); remote()->transact(BnCameraService::CONNECT, data, &reply); return interface_cast<ICamera>(reply.readStrongBinder()); } };
到此现在我们已经在Binder服务中注册了我们的CameraService服务,并提供了给客户端的代理类BpCameraService。