Camera framework/HAL(二)

接着上一遍文章,我们将理解CameraService的获取与构造。

CameraService的启动:

av/camera/cameraserver/Android.bp

->av/camera/cameraserver/cameraserver.rc

->av/camera/cameraserver/main_cameraserver.cpp

  • Andorid.mk将cameraserver.rc打包到system/etc/init目录下,并指定源代码为main_cameraserver.cpp
  • Android架构启动时启动init.rc进程,启动了位于system/etc/init目录下的cameraserver.rc。值得一提的是,同时也会启动zygote进程(第一个Java层进程,也是Java层所有进程的父进程)、ServiceManagermediaserver(多媒体服务进程,Android7.0之前cameraserver属于mediaserver,和mediaserver位于同一进程)、surfaceflinger(屏幕渲染相关的进程)等。之后zygote会孵化出启动system_server进程,Android framework里面的所有service(ActivityManagerService、WindowManagerService等)都是由system_server启动。关于system_server启动暂不讲述。
  • 启动cameraserver.rc时,执行main_cameraserver.cpp中的main方法,通过CameraServe::instantiaicte()初始化CameraService

/******************************************封存********************************************/

OpenCamera中使用CameraService.

如何传递到CameraService.cpp中

base/core/java/android/hardware/camera2/CameraManager.java

connectDevice->

av/camera/aidl/android/hardware/ICameraService.aidl

connectDevice->

av/services/camera/libcameraservice/hidl/HidlCameraService.cpp

connectDevice->

av/services/camera/libcameraservice/CameraService.cpp

connectDevice->

    ret = connectHelper<hardware::camera2::ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id,
            /*api1CameraId*/-1,
            CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageNameAdj, clientFeatureId,
            clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);

cameraCb;ICameraDeviceCallbacks
clientPackageNameAdj:getOpPackageName包名
id:cameraId
client:CameraDeviceClient

//此处传入参数mCameraProviderManager暂未分析,

        if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId,
                cameraId, api1CameraId, facing,
                clientPid, clientUid, getpid(),
                halVersion, deviceVersion, effectiveApiLevel,
                /*out*/&tmp)).isOk()) {
            return ret;
        }

....
        err = client->initialize(mCameraProviderManager, mMonitorTags);

makeClient:

            else { // Camera2 API route
                sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                        static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
                *client = new CameraDeviceClient(cameraService, tmp, packageName, featureId,
                        cameraId, facing, clientPid, clientUid, servicePid);
            }

ICameraDeviceCallbacks

CameraDeviceClient

CameraDeviceClient->Camera2ClientBase->

CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
        const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,//回调函数
        const String16& clientPackageName,
        const std::unique_ptr<String16>& clientFeatureId,
        const String8& cameraId,
        int cameraFacing,
        int clientPid,
        uid_t clientUid,
        int servicePid) :
    Camera2ClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,
                cameraId, /*API1 camera ID*/ -1,
                cameraFacing, clientPid, clientUid, servicePid),
    mInputStream(),
    mStreamingRequestId(REQUEST_ID_NONE),
    mRequestIdCounter(0) {

    ATRACE_CALL();
    ALOGI("CameraDeviceClient %s: Opened", cameraId.string());
}


template <typename TClientBase>
Camera2ClientBase<TClientBase>::Camera2ClientBase(
        const sp<CameraService>& cameraService,
        const sp<TCamCallbacks>& remoteCallback,
        const String16& clientPackageName,
        const std::unique_ptr<String16>& clientFeatureId,
        const String8& cameraId,
        int api1CameraId,
        int cameraFacing,
        int clientPid,
        uid_t clientUid,
        int servicePid):
        TClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,
                cameraId, api1CameraId, cameraFacing, clientPid, clientUid, servicePid),
        mSharedCameraCallbacks(remoteCallback),
        mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),
        mDevice(new Camera3Device(cameraId)),
        mDeviceActive(false), mApi1CameraId(api1CameraId)
{
    ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),
            String8(clientPackageName).string(), clientPid, clientUid);

    mInitialClientPid = clientPid;
    LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
REST/HAL(Hypertext Application Language)是一种基于REST原则的超媒体应用程序架构。它提供了一种标准化的方式来设计和组织Web API,以便客户端可以通过链接和资源状态来进行导航和交互。 在实践中,使用REST/HAL可以带来以下好处: 1. 代码可读性和可维护性:REST/HAL使用链接来表示资源之间的关系,使得API的结构更加清晰和易于理解。客户端可以通过链接发现和导航资源,而不需要硬编码URL和操作。 2. 松散耦合:REST/HAL通过使用超媒体链接来解耦客户端和服务端,使得API的演进更加容易。服务端可以更改资源的URL或添加新的资源,而不会对客户端产生影响。 3. 自描述性:HAL使用标准的JSON格式来描述资源和链接,使得API具有自我描述的特性。客户端可以通过解析HAL响应来了解可用的操作和资源。 4. 可扩展性:REST/HAL是一种灵活的架构,允许添加自定义的链接和属性。这使得API可以根据业务需求进行扩展和定制。 在实践中,使用REST/HAL可以按照以下步骤进行: 1. 设计资源模型:定义API中的资源和它们之间的关系。 2. 使用HAL格式:使用HAL的JSON格式来表示资源和链接。HAL提供了一些标准的属性和链接关系,如_self、_links和_embedded。 3. 提供链接关系:在响应中提供相关资源的链接关系。客户端可以通过这些链接来导航和操作资源。 4. 使用链接导航:客户端使用响应中的链接来导航和操作资源。客户端可以通过解析响应中的链接关系来了解可用的操作。 5. 可选的嵌入资源:如果需要,可以将相关资源嵌入到响应中,以减少客户端的请求次数。 总结起来,REST/HAL是一种基于超媒体的API设计风格,它提供了一种标准化的方式来设计和组织API。使用REST/HAL可以提高API的可读性、可维护性和可扩展性,同时也可以减少客户端和服务端之间的耦合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值