Android P之Camera HAL3流程分析(0)

本文详细介绍了Android P中Camera服务的启动流程,包括CameraProvider服务的注册、cameraserver服务的注册,以及Camera HAL3如何通过HIDL与cameraserver进程通信。分析了Treble机制如何将service与HAL隔离,并讨论了服务注册、通信机制及Camera HAL的实现细节。
摘要由CSDN通过智能技术生成

目录

参考文献

注册CameraProvider服务

注册cameraserver服务

类和服务调用


参考文献

[Android O] Camera 服务启动流程简析
[Android O] HAL3 之 Open Camera2 流程(零)—— 概览
[Android O] HAL3 之 Open Camera2 流程(一)—— 从 App 到 CameraService
[Android O] HAL3 之 Open Camera2 流程(二)—— 从 CameraService 到 HAL Service
[Android O] HAL3 之 Open Camera2 流程(三,完结)—— 从 HAL Service 到 Camera HAL

 

android6.0源码分析之Camera API2.0简介
android6.0源码分析之Camera2 HAL分析
android6.0源码分析之Camera API2.0下的初始化流程分析
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
android6.0源码分析之Camera API2.0下的Capture流程分析
android6.0源码分析之Camera API2.0下的video流程分析
 

Camera API2.0的应用

Android Camera:总结

Android camera子系统HAL层介绍集锦

Android 8.0系统源码分析--相机createCaptureSession创建过程源码分析

高通平台

Camera2 数据流从framework到Hal源码分析

mm-camera层frame数据流源码分析

在 Android O 中,系统启动时,就会启动 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)。

 

注册CameraProvider服务

创建服务端的 CameraProviderImpl 对象,后续client端会调用。
hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc
service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64

    class hal
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    capabilities SYS_NICE
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks

hardware/interfaces/camera/provider/2.4/default/service.cpp
int main()
{
    android::ProcessState::initWithDriver("/dev/vndbinder"); //打开vndservicemanager服务,可以和其它vendor进程通信
    return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0", /*maxThreads*/ 6);
}
system/libhidl/transport/include/hidl/LegacySupport.h
template<class Interface> /* 模板函数,Interface = ICameraProvider */
status_t defaultPassthroughServiceImplementation(std::string name, size_t maxThreads = 1) {
     /* 第一次执行这个函数会open(/dev/hwbinder) */
     configureRpcThreadpool(maxThreads, true);
     /* 这个函数做了两件事:
     * 1、得到了 CameraProvider 实例化对象
     * 2、注册 CameraProvider 实例化对象 */
    status_t result = registerPassthroughServiceImplementation<Interface>(name);
     joinRpcThreadpool();
}
template<class Interface>
status_t registerPassthroughServiceImplementation(std::string name = "default") {
    
     /* 就是调用 ICameraProvider::getService()
     * getStub = ture 时,getservice 以 passthrough 模式打开 HAL 实现
     * 所以这个会得到CameraProvider实例化对象(不是binder代理)
    */
     sp<Interface> service = Interface::getService(name, true /* getStub */);
     /*将 CameraProvider 注册为一个服务
     * 其他进程需要使用 camera HAL层时通过binder得到CameraProvider代理类即可操作camera HAL层
     * 不需要像以前一样每次都 dlopen(xxx.so)
    */
     status_t status = service->registerAsService(name);
 }
-----------------------------------------------------------------------------------------------------------------------------------
/* CameraProviderAll.cpp */
::android::status_t ICameraProvider::registerAsService(const std::string &serviceName) {
    ::android::hardware::details::onRegistration("android.hardware.camera.provider@2.4", "ICameraProvider", serviceName);
     /*
     * 得到 BpHwServiceManager 对象
     * 就是 HwServiceManager 对象的 binder 代理
     * 后面会分析如何得到 BpHwServiceManager 对象
    */
    const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm
            = ::android::hardware::defaultServiceManager();
     /*
     * 调用 BpHwServiceManager::add() 注册服务
     * 后面分析
     */
    ::android::hardware::Return<bool> ret = sm->add(serviceName.c_str(), this);
    return ret.isOk() && ret ? ::android::OK : ::android::UNKNOWN_ERROR;
}
CameraProviderAll.cpp来自hardware/interfaces/camera/provider/2.4/ICameraProvider.hal

-----------------------------------------------------------------------------------------------------------------------------------
Camera HAL的实现
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/Android.mk
LOCAL_MODULE := android.hardware.camera.provider@2.4-impl-mediatek

alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/instance.cpp
ICameraProvider*
HIDL_FETCH_ICameraProvider(const char* name){
    return createICameraProvider_V2_4(name, getCameraDeviceManager());
}
ICameraProvider*
createICameraProvider_V2_4(const char* providerName, NSCam::ICameraDeviceManager* manager){
    auto provider = new CameraProviderImpl(providerName, manager);
    provider->initialize();
    return provider;
}
获得CameraDeviceManager对象
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/instance.cpp
NSCam::ICameraDeviceManager*
getCameraDeviceManager(){
    static NSCam::CameraDeviceManagerImpl singleton(getProviderType().c_str());
    static bool init = singleton.initialize();
    return &singleton;
}
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase.cpp
CameraDeviceManagerBase::
initialize(){
    auto loadDeviceFactory = [](char const* libname, char const* symbol) {
        VirtEnumDeviceFactory item;
        item.mLibHandle = ::dlopen(libname, RTLD_NOW);
        *(void **)(&item.mCreateVirtualCameraDevice) = ::dlsym(item.mLibHandle, symbol);
        return item;
    };
    //从动态库中加载 createVirtualCameraDevice 函数的实现赋值给 mCreateVirtualCameraDevice
    mVirtEnumDeviceFactoryMap[3] = loadDeviceFactory("libmtkcam_device3.so", "createVirtualCameraDevice");
    enumerateDevicesLocked();
}
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase_camera.cpp
CameraDeviceManagerBase::
enumerateDevicesLocked(){
    onEnumerateDevicesLocked();
}
CameraDeviceManagerImpl::
onEnumerateDevicesLocked(){
    IHalLogicalDeviceList* pHalDeviceList;
    //加载libmtkcam_modulefactory_utils.so
    pHalDeviceList = MAKE_HalLogicalDeviceList();
    size_t const deviceNum = pHalDeviceList->searchDevices();
    mVirtEnumDeviceMap.setCapacity(deviceNum*2);
    //构造多个CameraDevice3Impl并保存到mVirtEnumDeviceMap中,通过instanceId区别
    for (size_t instanceId = 0; instanceId < deviceNum; instanceId++)
    {
        sp<IMetadataProvider> pMetadataProvider;
        //创建MetadataProvider
        pMetadataProvider = IMetadataProvider::create(instanceId);
        NSMetadataProviderManager::add(instanceId, pMetadataProvider.get());
        // 获得对应deviceid的元数据信息
        addVirtualDevicesLocked(instanceId, pMetadataProvider);
    }
}
-----------------------------------------------------------------------------------------------------------------------------------
//创建MetadataProvider
alps/vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/metadataprovider/MetadataProvider.cpp
IMetadataProvider*
IMetadataProvider::
create( int32_t const   i4OpenId ){
    MetadataProvider* p = new MetadataProvider(i4OpenId);
    //初始化
    p->onCreate();
    return  p;
}
MetadataProvider::
MetadataProvider( int32_t const   i4OpenId ){
    IHalLogicalDeviceList* pHalDeviceList;
    pHalDeviceList = MAKE_HalLogicalDeviceList();
    int32_t sensorType = pHalDeviceList->queryType(i4OpenId);
    int32_t sensorDev = pHalDeviceList->querySensorDevIdx(i4OpenId);
    const char* sensorDrvName = pHalDeviceList->queryDriverName(i4OpenId);
    mInfo = Info(i4OpenId, sensorDev, sensorType, sensorDrvName);
    showCustInfo();
}
MetadataProvider::
onCreate(){
    IMetadataTagSet mtagInfo;
   //根据IMetadataTagSet获得IMetadataConverter用于解析,定义了宏 _IMP_TAGCONVERT_  使用宏填充数据
    setTagInfo(mtagInfo);

    //构造IMetadataConverter对象
    sp<IMetadataConverter> pMetadataConverter = IMetadataConverter::createInstance(mtagInfo);
    //使用IMetadataConverter初始化camera_metadata和IMetadata
    status = constructStaticMetadata(pMetadataConverter, mpStaticCharacteristics, mpHALMetadata);
}
bool setTagInfo(IMetadataTagSet &rtagInfo){
    #define _IMP_SECTION_INFO_(...)
    #define _IMP_TAG_INF

  • 14
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值