Android R camera Hal启动(上)

这篇博客详细分析了Android R中camera HAL的启动流程,从进程名称入手,逐步探讨了Android.bp文件、rc文件、service.cpp以及hidl服务的注册。作者深入到CameraProvider的实现,解释了如何加载和初始化相机服务的相关库,特别是android.hardware.camera.provider@2.4-impl.so的加载过程。最后,文章以一个简短的总结收尾,预告了接下来将深入到高通平台的camera HAL初始化部分。
摘要由CSDN通过智能技术生成


前言

之前准备按照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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值