Android Camera(三) CameraService启动流程 (androidP)

本文解析了Android Camera Service的启动过程,从cameraserver.rc配置文件开始,详细跟踪了CameraService的创建、CameraProvider的初始化及服务注册,展示了关键函数如instantiate()和onFirstRef()的作用。

cameraserver.rc

路径  frameworks/av/camera/cameraserver/cameraserver.rc

        CameraService是由这个.rc文件启动的关于rc文件参见流程1

service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc readproc
    ioprio rt 4
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
    rlimit rtprio 10 10

main_cameraserver.cpp 

路径  frameworks/av/camera/cameraserver/main_cameraserver.cpp 

        CameraService::instantiate() 接口定义在 BinderService 中,CameraService继承它,instantiate() 函数定义在

路径  android/frameworks/native/libs/binder/include/binder/BinderService.h

创建一个new CameraService,名为media.camera并将其加入到 ServiceManager 中。

        getServiceName() = "media.camera"

        因为SP指针的原因下一步调用到的是CameraService::onFirstRef()

int main(int argc __unused, char** argv __unused)
{
    signal(SIGPIPE, SIG_IGN);

    // Set 3 threads for HIDL calls
    hardware::configureRpcThreadpool(3, /*willjoin*/ false);

    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    CameraService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}


//路径  android/frameworks/native/libs/binder/include/binder/BinderService.h

static void instantiate() { publish(); }

static status_t publish(bool allowIsolated = false,
                            int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,
                              dumpFlags);
    }

//路径  frameworks/av/services/camera/libcameraservice/CameraService.h
static char const* getServiceName() { return "media.camera"; }

onFirstRef

路径  frameworks/av/services/camera/libcameraservice/CameraService.cpp

        在 CameraService::onFirstRef() 函数中,主要是调用 enumerateProviders() 函数获取CameraProvider信息

        new CameraProviderManager() 之后调用 initialize(), 并将CameraService作为 CameraProviderManager 的成员变量传递进去

void CameraService::onFirstRef()
{
    res = enumerateProviders();
    ...
}

status_t CameraService::enumerat
<think>我们正在讨论Android P系统中应用打开相机功能的实现流程。根据用户需求,我们需要分析从应用调用相机API到相机硬件工作的整个流程。结合Android系统架构,特别是相机服务的启动和调用流程,我们可以分为几个步骤:应用层调用、框架层处理、相机服务启动、HAL层交互等。同时,参考引用中提到的内容,我们可以知道相机预览视图(CameraSourcePreview)的使用以及相机开发的一些扩展点。 另外,引用[3]提到了Android系统启动流程,虽然不直接相关,但有助于理解相机服务在系统启动过程中的初始化。引用[1]则提到了相机功能的扩展和优化,这可以放在流程的后面作为扩展部分。 因此,我们按照以下步骤来组织回答: 1. 应用层:调用相机API 2. 框架层:ActivityManagerService和CameraService的交互 3. 相机服务的启动与初始化(如果尚未启动) 4. 相机服务通过HAL层与底层驱动交互 5. 相机预览的显示(涉及预览视图) 注意:我们讨论的是Android P(9.0)系统,这个版本中相机架构相比之前有变化(如引入了CameraProviderService),因此需要特别注意。 具体流程如下: 步骤1:应用层通过Intent或Camera2 API打开相机 - 使用Intent:通过隐式Intent调用系统相机应用 - 使用Camera2 API:直接在自己的应用中使用相机 步骤2:框架层处理 - ActivityManagerService(AMS)处理打开相机的请求,并通知CameraService - CameraService是系统服务,负责管理相机设备的连接、配置等 步骤3:相机服务的启动(如果未启动) - 在系统启动时,CameraService由SystemServer启动(引用[3]中提到的系统启动流程) - CameraService启动后,会初始化CameraProviderService(Android P中引入),用于管理相机HAL 步骤4:相机服务通过HAL与底层交互 - CameraService通过CameraProviderService(实现了HIDL接口)与相机HAL进行通信 - 相机HAL负责与硬件驱动交互 步骤5:相机预览的创建和显示 - 应用通过SurfaceView或TextureView(或CameraSourcePreview)显示预览画面 - 相机服务将相机数据流传输到应用提供的Surface上 此外,我们还可以提到一些扩展点,如变焦、滤镜等(引用[1])。 生成相关问题: 1. Android P中CameraServiceCameraProviderService的关系是什么? 2. 如何通过Camera2 API实现相机预览? 3. 在Android相机开发中,如何处理相机权限? 4. 如何优化相机应用的启动速度? 注意:回答中需要适当引用提供的引用内容(在末尾添加引用标识)。 </think> ### Android P系统下应用打开相机功能实现流程Android P(9.0)系统中,应用打开相机功能的实现流程涉及多个系统层级,具体步骤如下: #### 1. **应用层调用** 应用通过`CameraManager` API发起请求: ```java CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE); String cameraId = manager.getCameraIdList()[0]; manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { // 相机设备准备就绪 } }, null); ``` 应用需声明相机权限`android.permission.CAMERA`,系统会验证权限状态[^1]。 #### 2. **框架层处理** - **CameraService交互** 应用调用通过Binder IPC到达`CameraService`(系统服务)。`CameraService`在系统启动时由`SystemServer`初始化,驻留在`media_server`进程[^3]。 - **权限与策略检查** `ActivityManagerService`验证应用UID的权限策略,`CameraService`检查设备策略(如企业模式禁用相机)。 #### 3. **HAL层连接** - **CameraProvider激活** `CameraService`通过HIDL接口调用`CameraProvider`服务(如`android.hardware.camera.provider@2.4-service`)。 - **硬件抽象层操作** `CameraProvider`加载厂商实现的相机HAL库(如`libmmcamera_interface.so`),通过`ioctl`与内核驱动交互。 #### 4. **预览流建立** ```java // 创建CaptureRequest并设置预览Surface SurfaceTexture texture = textureView.getSurfaceTexture(); Surface previewSurface = new Surface(texture); CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(previewSurface); camera.createCaptureSession(Arrays.asList(previewSurface), ...); ``` 应用需提供`Surface`对象,`CameraService`将相机数据流绑定到该`Surface`,通过`SurfaceFlinger`合成画面[^2]。 #### 5. **运行时流程** $$ \text{应用} \xrightarrow{\text{Binder IPC}} \text{CameraService} \xrightarrow{\text{HIDL}} \text{CameraProvider} \xrightarrow{\text{HAL}} \text{内核驱动} $$ 整个过程需在30ms内完成以避免ANR,厂商HAL实现直接影响性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值