[安卓相机系列] 零、CameraServer和CameraProvider的启动初始化

[安卓相机系列] 零、CameraServer和CameraProvider的启动初始化

一、前言

本文所使用代码为**android-10.0.0_r30分支,可以通过Android Code Search在线浏览源码,或通过repo工具将代码下载到本地。如何下载代码,请参考下载源代码,建议使用清华大学的Android镜像**,使用帮助:Android 镜像使用帮助

在开始前,最好能掌握或了解以下基础知识(别担心,掌握最基础的即可,剩下的可以在阅读和理解源码的过程中慢慢学):

  • 编程语言基础:C/C++、Java

  • Android中的智能指针:轻量指针、强引用指针、弱引用指针

  • Binder通信机制

  • AIDL与HIDL

  • Makefile

  • ……(留坑,想到再补充)

另外最好能有以下工具或掌握以下技能:

  • 一台性能不错、可以科学上网的电脑
  • vim_,我是vimer
  • Android Studio

二、开始分析

2.1 CameraService的启动初始化

2.1.1 CameraServer的启动

程序的执行,一定会有一个入口函数(更微观地说,是入口地址)。一般来说,不做特殊指定的话,默认的入口函数为main()函数。那么,先来找到CameraServermain()函数吧。

文件路径:frameworks/av/camera/cameraserver/main_cameraserver.cpp

int main(int argc __unused, char** argv __unused)
{
   
    signal(SIGPIPE, SIG_IGN);

    // Set 5 threads for HIDL calls. Now cameraserver will serve HIDL calls in
    // addition to consuming them from the Camera HAL as well.
    hardware::configureRpcThreadpool(5, /*willjoin*/ false);

    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    CameraService::instantiate();
    ALOGI("ServiceManager: %p done instantiate", sm.get());
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

这里面其实重要的是这么一句:CameraService::instantiate();,这句话完成了CameraService服务的注册以及初始化工作。方法instantiate()是类CameraService所继承的模板父类BinderService中的静态方法,看以下它的实现。

文件路径:frameworks/native/libs/binder/include/binder/BinderService.h

template<typename SERVICE>
class BinderService
{
   
public:
    static status_t publish(bool allowIsolated = false, int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
   
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated, dumpFlags);
    }

    static void publishAndJoinThreadPool(
            bool allowIsolated = false,
            int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
   
        publish(allowIsolated, dumpFlags);
        joinThreadPool();
    }

    static void instantiate() {
    publish(); }
    // ......
}

可以看到,instantiate()方法的作用就是调用了BinderService类自身的publish()方法,获取ServiceManager服务,调用其addService()方法将它注册到ServiceManager,这个过程中,创建了服务对象的实例。关于如何注册ServiceManager,这些细节此处不考虑,以后再出一篇文章文章详细分析下。只需要了解,这一步,完成了CameraService的启动和初始化工作,并将CameraService注册到了ServiceManager,那么其他地方,就可以通过ServiceManager去获取这个服务。

服务CameraService的启动初始化在进程CameraServer的启动过程中,如果CameraService启动成功了,进程也就启动成功了。但好像有些意犹未尽的感觉:这也太快了,没深入多少吧。别急,下面看以下CameraService的启动与实例化。

2.1.2 CameraService的启动与实例化

CameraService作为一个服务存在于安卓系统当中,它运行在CameraServer这个进程当中。(应当注意CameraServerCameraService的区别)

文件路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp

CameraService::CameraService() :
        mEventLog(DEFAULT_EVENT_LOG_LENGTH),
        mNumberOfCameras(0),
        mSoundRef(0), mInitialized(false) {
   
    ALOGI("CameraService started (pid=%d)", getpid());
    mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
}

void CameraService::onFirstRef()
{
   
    ALOGI("CameraService process starting");

    BnCameraService::onFirstRef();

    // Update battery life tracking if service is restarting
    BatteryNotifier& notifier(BatteryNotifier::getInstance());
    notifier.noteResetCamera();
    notifier.noteResetFlashlight();

    status_t res = INVALID_OPERATION;

    res = enumerateProviders();
    if (res == OK) {
   
        mInitialized = true;
    }

    mUidPolicy = new UidPolicy(this);
    mUidPolicy->registerSelf();
    mSensorPrivacyPolicy = new SensorPrivacyPolicy(this);
    mSensorPrivacyPolicy->registerSelf();
    sp<HidlCameraService> hcs = HidlCameraService::getInstance
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值