Android R camera Hal启动(上)


前言

之前准备按照camera APP调用API1/2的接口一点点的写代码流程。本地写了几篇之后发现不把camera server和hal的初始化写完,直接开始写API调用流程的话不太好写。还是从服务的初始化开始写吧。

代码流程分析

我就按照自己习惯的学习一个新的模块的思路来写。
先通过ps命令看一下当前camera hal运行的进程叫什么。

cameraserver    946      1  0 S android.hardware.camera.provider@2.4-service_64

从手机运行的进程看,当前运行的camera Hal是android.hardware.camera.provider@2.4-service_64
根据这个名称再到代码里面搜一下,定义在hardware/interfaces/camera/provider/2.4/default/Android.bp中。

cc_binary {
   
    name: "android.hardware.camera.provider@2.4-service_64",
    defaults: ["camera_service_defaults"],
    compile_multilib: "64",
    init_rc: ["android.hardware.camera.provider@2.4-service_64.rc"],
}

使用了android.hardware.camera.provider@2.4-service_64.rc,rc文件没啥好分析的,就是告诉init进程该去哪里以什么方式启动什么进程。
看下rc的内容:

service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64
    interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
    class hal
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    capabilities SYS_NICE
    task_profiles CameraServiceCapacity HighPerformance

defaults: [“camera_service_defaults”]编译相关

cc_defaults {
   
    name: "camera_service_defaults",
    defaults: ["hidl_defaults"],
    proprietary: true,
    relative_install_path: "hw",
    srcs: ["service.cpp"],
...

从srcs: [“service.cpp”]可以看出,android.hardware.camera.provider@2.4-service_64主要就是用这个cpp编译生成的。再来看看service.cpp。

#ifdef LAZY_SERVICE
const bool kLazyService = true;
#else
const bool kLazyService = false;
#endif

int main()
{
   
    ALOGI("CameraProvider@2.4 legacy service is starting.");
    // The camera HAL may communicate to other vendor components via
    // /dev/vndbinder
    android::ProcessState::initWithDriver("/dev/vndbinder");
    status_t status;
    if (kLazyService) {
   
        status = defaultLazyPassthroughServiceImplementation<ICameraProvider>("legacy/0",
                                                                              /*maxThreads*/ 6);
    } else {
   
        status = defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0",
                                                                          /*maxThreads*/ 6);
    }
    return status;
}

LAZY_SERVICE的宏不确定是不是被定义了,再回去看看android.bp

cc_binary {
   
    name: "android.hardware.camera.provider@2.4-service-lazy",
    overrides: ["android.hardware.camera.provider@2.4-service"],
    defaults: ["camera_service_defaults"],
    compile_multilib: "32",
    init_rc: ["android.hardware.camera.provider@2.4-service-lazy.rc"],
    cflags: ["-DLAZY_SERVICE"],
}

cc_binary {
   
    name: "android.hardware.camera.provider@2.4-service-lazy_64",
    overrides: ["android.hardware.camera.provider@2.4-service_64"],
    defaults: ["camera_service_defaults"],
    compile_multilib: "64",
    init_rc: ["android.hardware.camera.provider@2.4-service-lazy_64.rc"],
    cflags: ["-DLAZY_SERVICE"],
}

只找到了上面两处定义LAZY_SERVICE的地方,所以这里kLazyService 肯定是false了。最终会调用defaultPassthroughServiceImplementation
这就是注册hidl服务,调用到system/libhidl/transport/include/hidl/LegacySupport.h中。

template <class Interface, class ExpectInterface = Interface>
__attribute__((warn_unused_result)) status_t defaultPassthroughServiceImplementation(
        const std::string& name, size_t maxThreads = 1) {
   
    configureRpcThreadpool(maxThreads, true);
    status_t result = registerPassthroughServiceImplementation<Interface, ExpectInterface>(name);

    if (result != OK) {
   
        return result;
    }

    joinRpcThreadpool();
    return UNKNOWN_ERROR;
}

调用registerPassthroughServiceImplementation

template <class Interface, class ExpectInterface = Interface>
__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
        const std::string& name = "default") {
   
    return registerPassthroughServiceImplementation(Interface::descriptor,
                                                    ExpectInterface::descriptor, name);
}

调用registerPassthroughServiceImplementation

__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
        const std::string& interfaceName, const std::string& expectInterfaceName,
        const std::string& serviceName) {
   
    return details::registerPassthroughServiceImplementation(
            interfaceName, expectInterfaceName,
            [](const sp<IBase>& service, const std::string& name) {
   
                return details::registerAsServiceInternal(service, name);
            },
            serviceName);
}

调用registerPassthroughServiceImplementation

__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
        const std::string& interfaceName, const std::string& expectInterfaceName,
        RegisterServiceCb registerServiceCb, const std::string& serviceName) {
   
    sp<IBase> service =
            getRawServiceInternal(interf
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Camera HAL启动流程主要分为以下几个步骤。 首先,上层应用通过调用CameraManager的openCamera方法来请求打开相机。这个方法会调用CameraManagerService中的openCamera方法,并传递相应的参数。 接着,CameraManagerService会查找相应的硬件相机模块,使用hw_get_module函数来获取相机模块的实例。这个函数会根据设备配置文件中的相机模块信息来加载相应的动态库,并返回相机模块的实例。 然后,CameraManagerService会通过getCameraInfo方法获取相机的详细信息,包括相机的ID、方向和镜像设置等。 接下来,CameraManagerService会调用相机模块的open方法来打开相机设备。相机模块会根据具体硬件实现来进行相机设备的初始化工作。 在相机设备打开成功后,CameraManagerService会创建一个CameraDevice实例,并将其返回给上层应用。 最后,上层应用可以通过CameraDevice实例来进行相机的操作,例如拍照、录像等。 总之,Camera HAL启动流程包括应用调用CameraManager的openCamera方法、CameraManagerService查找相机模块、相机模块的初始化和相机设备的打开。通过这些步骤,上层应用可以获取到一个可用的相机设备,并进行相关的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Camera打开流程](https://download.csdn.net/download/sinat_21855227/9483107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Android 13 Camera HAL启动流程(1)](https://blog.csdn.net/weixin_41678668/article/details/130958729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Android 13 Camera HAL启动流程(2)](https://blog.csdn.net/weixin_41678668/article/details/130997399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值