Android Camera Provider and Service 启动流程

总体框架 

@图. 主要调用步骤总览
cameraserver 与 provider 这两个进程启动、初始化的调用逻辑,如上图所示
(Thanks to : https://blog.csdn.net/qq_16775897/article/details/81240600)


总体逻辑顺序:

provider 进程启动,注册;
cameraserver 进程启动,注册,初始化;
cameraserver 获取远端 provider(此时实例化 CameraProvider 并初始化)

上图中,实线箭头是调用关系。左边是 cameraserver 进程中的动作,右边则是 provider 进程中的动作,它们之间通过 ICameraProvider 联系在了一起

CameraProvider

在 Android 系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 CameraServer 进程中分离出来,作为一个独立进程 android.hardware.camera.provider@2.4-service 来控制 HAL。 这两个进程之间通过 HIDL 机制进行通信。

这样的改动源自于 Android O 版本加入的 Treble 机制,它的主要功能(如下图所示)是将 service 与 HAL 隔离,以方便 HAL 部分进行独立升级。这其实和 APP 与 Framework 之间的 Binder 机制类似,通过引入一个进程间通信机制而针对不同层级进行解耦(从 Local call 变成了 Remote call)。

1. CameraProvider 的启动与注册
这个服务进程的启动很简单,主要动作是注册该 CameraProvider,以便 CameraServer 启动时能找到它.
/hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc

1service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
2    interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
3    class hal
4    user cameraserver
5    group audio camera input drmrpc
6    ioprio rt 4
7    capabilities SYS_NICE
8    task_profiles CameraServiceCapacity MaxPerformance

/hardware/interfaces/camera/provider/2.4/default/service.cpp
​​​​​​​

CameraService

2. CameraService 的启动与初始化

/frameworks/av/camera/cameraserver/cameraserver.rc

1service cameraserver /system/bin/cameraserver
2    class main
3    user cameraserver
4    group audio camera input drmrpc
5    ioprio rt 4
6    task_profiles CameraServiceCapacity MaxPerformance
7    rlimit rtprio 10 10


一般来说应该是 Provider 服务先启动,然后 Cameraserver 再启动,并 ”连接“ 到 Provider
/frameworks/av/camera/cameraserver/main_cameraserver.cpp

CameraService::instantiate();

实例化CameraService 只有简单的一行代码,但实例化的过程并不那么简单。这个 instantiate() 接口并不是定义在 CameraService 类中的,而是定义在 BinderService 类里(而 CameraService 继承了它)。在此处,它的作用是创建一个 CameraService(通过 new 的方式),并将其加入到 ServiceManager 中(注意,在这一过程中,CameraService 被强指针引用了)

/frameworks/av/services/camera/libcameraservice/CameraService.cpp
由于首次被强指针引用时,就会调用 onFirstRef() 函数执行初始化之类的业务逻辑,初始化的主要逻辑实现应该在 enumerateProviders() 函数中, 它首先将 CameraProviderManager 实例化,然后调用 initialize() 接口将其初始化,传入的参数是 this 指针,指向当前 CameraService 实例的地址

if (nullptr == mCameraProviderManager.get()) {
    mCameraProviderManager = new CameraProviderManager();
    res = mCameraProviderManager->initialize(this);
    if (res != OK) {
        ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
                __FUNCTION__, strerror(-res), res);
        return res;
    }
}

/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp

    for (const auto& instance : mServiceProxy->listServices()) {
        this->addProviderLocked(instance);
    }
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {
    
    //检查已知的 Provider 匹配(legacy/0)
    for (const auto& providerInfo : mProviders) {
        if (providerInfo->mProviderName == newProvider) {
            ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
                    newProvider.c_str());
            return ALREADY_EXISTS;
        }
    }

    //获取 CameraProvider 接口,初始化CameraProvider
    sp<provider::V2_4::ICameraProvider> interface;
    interface = mServiceProxy->tryGetService(newProvider);

    if (interface == nullptr) {
        ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
                newProvider.c_str());
        return BAD_VALUE;
    }
    
    //通过 ProviderInfo 来保存当前 Provider 相关信息
    sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);
    status_t res = providerInfo->initialize(interface, mDeviceState);
    if (res != OK) {
        return res;
    }
    
    //记录当前 Provider
    mProviders.push_back(providerInfo);

    return OK;
}

3. CameraProvider 的初始化

在 CameraService 的初始化过程中,CameraProvider 才开始进行初始化,只不过这个初始化是通过服务代理进行远端调用而进行的。

在 CameraProviderManager::addProviderLocked 函数的实现逻辑中,调用了 ICameraProvider::getService 接口,该接口最终会调用到一个名为 HIDL_FETCH_ICameraProvider 的函数。
 

/hardware/interfaces/camera/provider/2.4/default/CameraProvider_2_4.cpp
/hardware/google/camera/common/hal/hidl_service/hidl_camera_provider.cc

 

CameraProviderService

CameraService

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值