• CameraService启动-Android12


    CameraService启动-Android12

    android12-release
    在这里插入图片描述
    相机 | Android开源项目


    1. cameraserver.rc

    init进程解析cameraserver.rc,Service::Start() fork进程cameraserver并启动对应文件main_cameraserver.cpp中main方法

    frameworks/av/camera/cameraserver/cameraserver.rc

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

    frameworks/av/camera/cameraserver/Android.bp

    cc_binary {
        name: "cameraserver",
    
        srcs: ["main_cameraserver.cpp"],
    
        header_libs: [
            "libmedia_headers",
        ],
    
        shared_libs: [
            "libcameraservice",
            // ... ... ,
        ],
        compile_multilib: "first",
        cflags: [
            "-Wall",
            "-Wextra",
            "-Werror",
            "-Wno-unused-parameter",
        ],
    
        init_rc: ["cameraserver.rc"],
    
        vintf_fragments: [
            "manifest_android.frameworks.cameraservice.service@2.2.xml",
        ],
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2. /system/bin/cameraserver启动main方法

    在这里插入图片描述

    2.1 初始化CameraService

    位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。

    • CameraService::instantiate()继承BinderService.h,调用到publish()defaultServiceManager()获取new BpServiceManager(new BpBinder(0)),添加CameraService到binder ServiceManager,名称为"media.camera"
      在这里插入图片描述
    • 继承RefBase实例化后调用onFirstRef()方法;enumerateProviders()中CameraProviderManager初始化initialize,并getCameraDeviceIds()获取cameradevices的所有id
    • mSensorPrivacyPolicy 启用了传感器隐私,则应阻止所有应用程序访问摄像头;HidlCameraService::getInstance(this) 服务ICameraService给到frameworks/av/services/camera/libcameraservice/hidl/HidlCameraService.h
    • CameraServiceProxyWrapper::pingCameraServiceProxy() CameraServiceProxy是Java层的系统服务,BinderName是media.camera.proxy在这里插入图片描述

    frameworks/native/libs/binder/include/binder/BinderService.h
    frameworks/av/services/camera/libcameraservice/CameraService.cpp

    CameraService::CameraService() :
            mEventLog(DEFAULT_EVENT_LOG_LENGTH),
            mNumberOfCameras(0),
            mNumberOfCamerasWithoutSystemCamera(0),
            mSoundRef(0), mInitialized(false),
            mAudioRestriction(hardware::camera2::ICameraDeviceUser::AUDIO_RESTRICTION_NONE) {
        ALOGI("CameraService started (pid=%d)", getpid());
        mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
        mMemFd = memfd_create(sFileName, MFD_ALLOW_SEALING);
        if (mMemFd == -1) {
            ALOGE("%s: Error while creating the file: %s", __FUNCTION__, sFileName);
        }
    }
    
    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();
        mInjectionStatusListener = new InjectionStatusListener(this);
        mAppOps.setCameraAudioRestriction(mAudioRestriction);
        sp<HidlCameraService> hcs = HidlCameraService::getInstance(this);
        if (hcs->registerAsService() != android::OK) {
            ALOGE("%s: Failed to register default android.frameworks.cameraservice.service@1.0",
                  __FUNCTION__);
        }
    
        // This needs to be last call in this function, so that it's as close to
        // ServiceManager::addService() as possible.
        CameraServiceProxyWrapper::pingCameraServiceProxy();
        ALOGI("CameraService pinged cameraservice proxy");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    2.2 CameraProviderManager初始化

    该方法enumerateProviders()中CameraProviderManager初始化initialize,并getCameraDeviceIds()获取cameradevices的所有id。这里查看CameraProviderManager与CameraProvider进程建立联系。

    • ServiceInteractionProxy* proxy参数默认赋值&sHardwareServiceInteractionProxy,是远程代理类
      在这里插入图片描述
    • mServiceProxy->registerForNotifications(this) 调用到 hardware::defaultServiceManager()->registerForNotifications() (system/libhidl/transport/ServiceManagement.cpp)
    • mServiceProxy->listServices() 通过hardware::defaultServiceManager1_2()获取注册的服务,并addProviderLocked(instance)创建ProviderInfo对象添加mProviders中。这里主要是和CameraProvider和ExternalCameraProvider建立联系(android.hardware.camera.provider@2.4::ICameraProvider external/0 、 android.hardware.camera.provider@2.4::ICameraProvider legacy/0)
      在这里插入图片描述 在这里插入图片描述

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

    status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
            ServiceInteractionProxy* proxy) {
        std::lock_guard<std::mutex> lock(mInterfaceMutex);
        if (proxy == nullptr) {
            ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
            return BAD_VALUE;
        }
        mListener = listener;
        mServiceProxy = proxy;
        mDeviceState = static_cast<hardware::hidl_bitfield<provider::V2_5::DeviceState>>(
            provider::V2_5::DeviceState::NORMAL);
    
        // Registering will trigger notifications for all already-known providers
        bool success = mServiceProxy->registerForNotifications(
            /* instance name, empty means no filter */ "",
            this);
        if (!success) {
            ALOGE("%s: Unable to register with hardware service manager for notifications "
                    "about camera providers", __FUNCTION__);
            return INVALID_OPERATION;
        }
    
    
        for (const auto& instance : mServiceProxy->listServices()) {
            this->addProviderLocked(instance);
        }
    
        IPCThreadState::self()->flushCommands();
    
        return OK;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3. Binder启动线程池并加入

      初始化CameraService时已添加"media.camera"到Binder;接着startThreadPool()启动Binder线程池,joinThreadPool()当前线程加入到线程池,其他详情查看 Binder系列2-ServiceManager

    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    
    • 1
    • 2

    binder IPC 接口
    IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于 frameworks/av/camera/aidl/android/hardware 目录中。ICameraService 是相机服务的接口;ICameraDeviceUser 是已打开的特定相机设备的接口;ICameraServiceListener 和 ICameraDeviceCallbacks 分别是对应用框架的 CameraService 和 CameraDevice 回调。

    4. 简要时序图

    CameraService启动-Android12

  • 相关阅读:
    Java版本spring cloud + spring boot企业电子招投标系统源代码
    天翼物联网平台(AIoT)无感迁移能力
    SAP 第三方销售详解
    Golang格式化输出
    如何快速选购腾讯云NVIDIA GPU云服务器实例?
    M41T62Q6F 一款具有报警功能的低功耗串行实时时钟(RTC)芯片
    为什么要用回馈式电子负载
    6G:典型应用、关键技术与面临挑战
    洛谷刷题(普及-):车站、拼数、Cantor 表、回文数、进制转换
    docker-rabbitmq 安装依赖
  • 原文地址:https://blog.csdn.net/qq_23452385/article/details/126045021