android 5.1 camera

本文详细介绍了Android系统中CameraService的启动流程,包括其在main_mediaserver.cpp中的注册过程,以及通过BinderService模板类实现的发布和服务实例化机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 CameraService启动流程

  android framework中多媒体相关的都在,frameworks/av/media/mediaserver/main_mediaserver.cpp注册
  

// from LOCAL_C_INCLUDES,这个宏是在Android.mk中定义的,包含下面几个头文件的位置
#include "AudioFlinger.h"
#include "CameraService.h"
#include "MediaLogService.h"
#include "MediaPlayerService.h"
#include "AudioPolicyService.h"
#include "SoundTriggerHwService.h"
...
int main(int argc __unused, char** argv)
{
    ...
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate(); // CameraService实例化
    AudioPolicyService::instantiate();
    SoundTriggerHwService::instantiate();
    registerExtensions();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    ...
}

  在main_mediasever.cpp同目录的Android.mk中有下面代码,可知CameraService.h文件在framewoks/av/services/camera/libcameraservice目录下,两个重要文件CameraService.cpp和CameraService.h

LOCAL_C_INCLUDES := \
    frameworks/av/media/libmediaplayerservice \ 
    frameworks/av/services/medialog \
    frameworks/av/services/audioflinger \
    frameworks/av/services/audiopolicy \
    frameworks/av/services/camera/libcameraservice \
    $(call include-path-for, audio-utils) \
    frameworks/av/services/soundtrigger

  CameraService.cpp中并没有实现instantiate( )方法,而是由其父类BinderService来实现

//CameraService.h
class CameraService : public BinderService<CameraService>,  public BnCameraService,  public IBinder::DeathRecipient,
    public camera_module_callbacks_t
{
    friend class BinderService<CameraService>;
public:
    class Client;
    class BasicClient;
...
}
//./native/include/binder/BinderService.h
template<typename SERVICE>
class BinderService
{
public:
    static status_t publish(bool allowIsolated = false) {
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(
                String16(SERVICE::getServiceName()),
                new SERVICE(), allowIsolated);
    }
    static void instantiate() { publish(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值