Android camera系统开发之IPC (二)

本文深入探讨了Android系统服务管理器在初始化阶段的工作流程,包括服务管理器的启动、与binder驱动的交互以及如何处理服务请求。通过分析init.rc配置文件和service_manager.c源代码,阐述了服务管理器如何通过binder驱动进行服务管理,以及后续如CameraService等服务如何请求加入和获取Binder号的过程。

一      系统服务管理器启动

 

 

参考Android init 详细过程分析 ,我们知道系统在INIT进程中会分析INIT.RC

我们从init.rc中能看到如下代码

@init.rc

service servicemanager /system/bin/servicemanager

    user system

    critical

    onrestart restart zygote

    onrestart restart media

所以在INIT的时候会启动servicemanager服务。

 

@service_manager.c

int svcmgr_handler(struct binder_state *bs,

                   struct binder_txn *txn,

                   struct binder_io *msg,

                   struct binder_io *reply)

{

    …

    s = bio_get_string16(msg, &len);

    if ((len != (sizeof(svcmgr_id) / 2)) ||

        memcmp(svcmgr_id, s, sizeof(svcmgr_id))) {

        fprintf(stderr,"invalid id %s/n", str8(s));

        return -1;

    }

    switch(txn->code) {

    case SVC_MGR_GET_SERVICE:

    case SVC_MGR_CHECK_SERVICE:

        s = bio_get_string16(msg, &len);

        ptr = do_find_service(bs, s, len);

        bio_put_ref(reply, ptr);

        return 0;

    case SVC_MGR_ADD_SERVICE:

        s = bio_get_string16(msg, &len);

        ptr = bio_get_ref(msg);

        if (do_add_service(bs, s, len, ptr, txn->sender_euid))

            return -1;

        break;

      …

    }

    bio_put_uint32(reply, 0);

    return 0;

}

我们在以后会看到这几个被标红的case 。

 

总结一下:

    系统在init进程中会分析init.rc,并启动servicemanager服务。

这个服务管理器首先打开binder driver.并告诉binder driver,这是个服务管理进程,然后servicemanager将通过ioctl(bs->fd, BINDER_WRITE_READ, &bwr)读取binder driver的数据,如果没有数据读,将会挂起,一旦有数据出现,系统将通过binder_parse()来分析数据包,并调用svcmgr_handler()来处理分析后的内容,处理结束后再循环去等待binder driver中可读数据。一旦其他进程有对这个服务的请求需要,binder driver就会有数据可读。后续将看到Camera Service如何请求加入.Camera app如何请求获取Camera Service的Binder号

 

 

 

 

 

参考service_manager.c文件下的Android.mk

@frameworks/base/cmds/servicemanager/Android.mk

LOCAL_SRC_FILES := service_manager.c binder.c

LOCAL_MODULE := servicemanager

这两个文件service_manager.c binder.c会编译为名成为servicemanager应用程序。

而其入口函数是main()

@service_manager.c  

int main(int argc, char **argv)  

{  

  struct binder_state *bs;  

 

  void *svcmgr = BINDER_SERVICE_MANAGER; //=0  其BINDER_SERVICE_MANAGER定义是0

 

  bs = binder_open(128*1024);  

  binder_become_context_manager(bs);

  svcmgr_handle = svcmgr;  //0 存这个句柄

  binder_loop(bs, svcmgr_handler);  

  return 0;  

 

 

1 看到这行bs = binder_open(128*1024);

@frameworks/base/cmds/servicemanager/binder.c

struct binder_state *binder_open(unsigned mapsize)

{

    struct binder_state *bs;

    bs = malloc(sizeof(*bs));

     bs->fd = open("/dev/binder", O_RDWR);

     bs->mapsize = mapsize;

    bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);

    return bs;

}

用来打开binder的驱动

 

2 再看到这行binder_become_context_manager(bs);

@frameworks/base/cmds/servicemanager/binder.c

int binder_become_context_manager(struct binder_state *bs)

{

    return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);

}

    通过binder_become_context_manager函数调用来告诉Binder Driver这是一个服务管理进程

 

3 最后看到这行binder_loop(bs, svcmgr_handler);

@frameworks/base/cmds/servicemanager/binder.c

void binder_loop(struct binder_state *bs, binder_handler func)

{

    int res;

    struct binder_write_read bwr;

    unsigned readbuf[32];

    bwr.write_size = 0;

    bwr.write_consumed = 0;

    bwr.write_buffer = 0;

    readbuf[0] = BC_ENTER_LOOPER;

    binder_write(bs, readbuf, sizeof(unsigned));

    for (;;) {

        bwr.read_size = sizeof(readbuf);

        bwr.read_consumed = 0;

        bwr.read_buffer = (unsigned) readbuf;

        res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);

        res = binder_parse(bs, 0, readbuf, bwr.read_consumed, func);

        …

        }

    }

}

这是这个servicemanager的主体。

 

 

binder_loop这个函数首先向Binder申明进入BC_ENTER_LOOPER状态。

然后循环调用res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);读取Binder中的数据,如果没有数据,这个进程会被Binder Driver挂起,否则有数据将进入binder_parse(bs, 0, readbuf, bwr.read_consumed, func);分析处理。

真正的实质处理函数是通过binder_loop()传进来的svcmgr_handler()

 

<think> 嗯,用户想了解Android Camera系统框架的信息。根据引用内容,我看到有三个关键点:Camera APP、Camera ServiceCamera HAL进程构成三层框架[^1],API经历了从Camera1到Camera2再到CameraX的演进[^2],以及这个知识点在Android面试中的重要性[^3]。 用户可能是一位Android开发工程师,正在准备面试或开发相机相关功能。从问题看,ta需要体系化的框架解析,而不仅仅是碎片信息。考虑到相机系统涉及应用层、系统服务和硬件抽象,我决定按层级展开说明。 先梳理框架核心三层:应用层(Camera APP)负责交互逻辑,Java/Kotlin实现;系统服务层(CameraService)用C++处理权限和资源调度;HAL层由厂商实现驱动适配。这个分层结构能很好解释Android的跨平台特性[^1]。 接着补充API演进部分很重要。用户可能面临技术选型问题,需要知道Camera2提供更精细控制(如ManualCapture),而CameraX解决了设备兼容性痛点[^2]。引用中的对比表格(3.2.1-3.2.3)特别有价值,应该转化为口语化建议。 最后考虑面试场景,用户可能需要扩展知识边界。我计划在相关问题里加入性能调优和架构图获取途径[^3],这样既实用又能呼应引用中提到的"高级架构师知识体系"。 需要特别注意两点:一是避免直接复制引用中的代码片段(如3.3节内容),而是概括其设计思想;是强调CameraX的Jetpack集成优势,因为引用[2]明确标注其为"推荐方案"。 </think> 以下是Android Camera系统框架的体系化解析,结合核心进程分层、API演进及技术对比: --- ### **一、Android Camera三层核心架构** ```mermaid graph TD A[Camera APP] -->|Binder IPC| B(Camera Service) B -->|HIDL/ AIDL| C[Camera HAL] C --> D[硬件驱动] ``` 1. **应用层(Camera APP)** - 位置:`packages/apps/Camera2/src/com/android/camera` - 功能:处理用户交互、预览画面控制、拍照/录像逻辑 - 开发接口:Camera2 API / CameraX 2. **系统服务层(Camera Service)** - 进程:`system_server` 中的 `cameraserver` - 核心服务:`CameraService.cpp` (frameworks/av/services/camera) - 职责: - 权限验证(如相机使用权限) - 设备管理(多摄像头切换) - 资源调度(避免多应用并发冲突) 3. **硬件抽象层(Camera HAL)** - 接口定义:`hardware/interfaces/camera` - 厂商实现:由OEM提供(如Qualcomm的QCameraHAL) - 关键作用:将Android框架指令翻译为硬件操作(如传感器控制、ISP处理) --- ### **Camera API演进与技术对比** | **特性** | Camera1 (已弃用) | Camera2 (主流) | CameraX (推荐) | |--------------------|-----------------------|-----------------------|-----------------------| | **架构** | 同步阻塞 | 异步管道(Pipeline) | 生命周期感知 | | **性能瓶颈** | 单次仅1个请求 | 支持批量请求 | 自动设备兼容 | | **高级功能** | 受限(如手动对焦难) | 全面(手动曝光/RAW) | 扩展功能(HDR/人像) | | **代码复杂度** | ★★☆ | ★★★★ | ★★ | #### **关键升级解析** 1. **Camera2的Pipeline模型** ```java // 创建CaptureRequest CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(surface); // 提交异步请求 cameraCaptureSession.setRepeatingRequest(builder.build(), null, handler); ``` - 通过`CaptureSession`管理图像流,支持并行处理预览/拍照流 2. **CameraX的优势** - **自动兼容**:通过`CameraSelector`抽象设备差异(如前置/后置摄像头) - **生命周期绑定**:与Activity/Fragment自动同步开启/关闭相机 - **扩展插件**:直接调用厂商AI功能(如BokehEffect) --- ### **三、数据流核心路径** 1. **图像采集路径** 传感器 → HAL → `SurfaceTexture` → `Surface` → 渲染到TextureView - **低延迟关键**:`GRALLOC` 内存共享(避免数据拷贝) 2. **元数据传输** - HAL传递3A数据(AF/AE/AWB)→ CameraService → APP - 通过`CaptureResult`回调返回(Camera2) --- ### **四、开发建议** 1. **新项目首选CameraX** ```gradle implementation "androidx.camera:camera-core:1.3.0" implementation "androidx.camera:camera-camera2:1.3.0" ``` 2. **性能优化重点**: - 预览分辨率:匹配屏幕比例(避免缩放) - 图像格式:优先使用`YUV_420_888`替代JPEG - 线程管理:专用后台线程处理图像回调 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值