CameraService启动-Android12

Posted xhBruce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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",
    ],

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");

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;

3. Binder启动线程池并加入

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

ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();

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

4. 简要时序图

以上是关于CameraService启动-Android12的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera CameraService启动流程 (androidP)

Android Camera CameraService启动流程 (androidP)

Android Camera 打开预览流程分析--CameraService中的打开流程

Android Camera 打开预览流程分析--CameraService中的打开流程

Android Camera 打开预览流程分析--CameraService中的打开流程

Android Camera 打开预览流程分析-- Camera 连接到CameraService 过程分析