3. 需求分析(下):编写需求规格说明书(SRS)、定义接口需求(HIDL/AIDL)、性能需求(延迟、功耗)、安全需求

在完成用户需求与系统用例的梳理后,需求分析进入工程化阶段。本阶段的核心产出是需求规格说明书(SRS),它将模糊的“想要什么”转化为精确的“要做什么”。同时,针对 Camera HAL 的嵌入式特性,必须明确定义接口契约(HIDL/AIDL)、性能指标(延迟/功耗)以及安全基线。

3.1 需求规格说明书(SRS)的编写

SRS 是项目团队与客户之间的“唯一真理”。一份优秀的 SRS 必须满足 正确性、无歧义、完整性、一致性、可验证性 五大原则。对于 Camera HAL 项目,SRS 通常包含以下核心章节:

章节 内容要点 Camera HAL 示例
1. 引言 项目背景、定义、缩写(如 ISP、HAL、AE/AWB) 定义“预览延迟”为从 Sensor 曝光到 SurfaceFlinger 显示的第一帧时间
2. 总体描述 产品视角、用户特征、约束条件 硬件平台为 Qualcomm SM8550,OS 版本 Android 14
3. 外部接口需求 用户、硬件、软件、通信接口 HAL 必须暴露 AIDL 接口供 CameraService 调用
4. 系统功能 用例驱动的功能分解 支持 3 路并发:预览 + 拍照 + 视频
5. 性能需求 延迟、吞吐量、功耗、资源占用 预览延迟 ≤ 100ms,功耗 ≤ 350mW
6. 安全需求 数据保护、访问控制、加密 Camera 数据流必须经过 TEE 加密通道
7. 质量属性 可靠性、可维护性、可移植性 HAL 升级需兼容前向 ABI
工程提示: 在 SRS 中,每个需求条目必须附带唯一的 需求 ID(如 REQ-CAM-PERF-001),以便在后续设计、测试和变更追踪中精确追溯。

3.2 定义接口需求:HIDL 与 AIDL 的选择

在 Android Camera 架构中,HAL 与 Framework 的通信接口经历了从 HIDL 到 AIDL 的演进。选择哪种接口语言,直接影响系统的稳定性、性能与可维护性。

3.2.1 HIDL vs AIDL 对比

特性 HIDL (HAL Interface Definition Language) AIDL (Android Interface Definition Language)
设计目标 HAL 与 Framework 进程间解耦 通用 Binder 通信,统一 Android 生态
稳定性 强(通过 @VintfStability 保证 ABI) 强(通过 @VintfStability 或 @JavaOnlyStableParcelable)
性能 中等(需经过 hwservicemanager) 高(直接 Binder 调用,减少中间层)
代码生成 生成 C++ 客户端/服务端骨架 生成 Java/Kotlin 或 NDK C++ 代码
推荐场景 传统 HAL 实现(Android 8-12) 新项目或迁移项目(Android 13+)

3.2.2 AIDL 接口定义示例

以下是一个简化的 Camera HAL AIDL 接口片段,定义了核心的 configureStreams 方法:

// ICameraDevice.aidl
package vendor.camera.hardware;

import vendor.camera.hardware.StreamConfiguration;
import vendor.camera.hardware.CameraMetadata;

interface ICameraDevice {
    /**
     * 配置 Camera 数据流管道。
     * @param config 包含流类型、分辨率、格式等参数。
     * @return 操作状态码(0 表示成功)。
     */
    int configureStreams(in StreamConfiguration config);

    /**
     * 请求捕获单帧图像。
     * @param settings 3A 参数与效果设置。
     * @return 捕获帧的唯一标识符。
     */
    long capture(in CameraMetadata settings);

    /**
     * 关闭设备并释放资源。
     */
    void close();
}
避坑指南: 定义接口时,务必明确 in / out / inout 方向标记。对于 Camera 这类大数据量场景,优先使用 in 传递描述符,避免在 Binder 事务中直接传递大块数据(如 YUV 帧),应通过 SharedMemory 或 NativeHandle 传递。

3.3 性能需求:延迟与功耗

Camera HAL 的性能需求是嵌入式系统中最苛刻的维度之一。延迟和功耗直接影响用户体验和产品续航。

3.3.1 延迟需求分解

延迟指标必须分解到每个子模块,才能指导设计和测试。以下是一个典型的 Camera 流水线延迟预算:

Camera 预览延迟分解(目标 ≤ 100ms) Sensor 曝光 ISP 处理 HAL 回调 显示合成 ≤ 30ms ≤ 25ms ≤ 20ms ≤ 25ms 总延迟预算:30+25+20+25 = 100ms 注:以上为典型值,实际需根据 Sensor 帧率、ISP 负载动态调整

3.3.2 功耗需求分解

功耗需求通常以 mW 为单位,按 Camera 工作模式分别定义:

工作模式 典型功耗预算 关键优化点
预览(30fps) ≤ 350 mW 降低 ISP 时钟、使用低功耗 Sensor 模式
拍照(单帧) ≤ 500 mW(峰值) 限制 CPU/GPU 参与,硬件直通
视频录制(1080p@30) ≤ 450 mW 开启硬件编码器,关闭预览叠加层
待机(Standby) ≤ 5 mW 关闭 MCLK,Sensor 进入软件 standby
关键指标: 在 SRS 中,性能需求必须附带 测量条件。例如:“在 25°C 室温、屏幕亮度 200nit、Wi-Fi 关闭、仅 Camera 应用运行的条件下,预览延迟 ≤ 100ms,功耗 ≤ 350mW。”

3.4 安全需求

Camera 是隐私敏感设备,安全需求必须贯穿 HAL 设计始终。主要关注以下三个维度:

3.4.1 数据流安全

  • 加密传输: 从 Sensor 到 HAL 的原始数据(RAW/Bayer)必须通过硬件加密通道(如 Qualcomm SPU)传输。
  • 内存隔离: 使用 dma-buf 的 DMA_BUF_IOCTL_SYNC 确保非 Camera 进程无法直接访问帧缓冲区。
  • 安全回放: 视频录制时,关键帧(I-frame)必须添加数字水印,防止篡改。

3.4.2 访问控制

  • 权限模型: 严格遵循 Android CAMERA 权限组,HAL 层不绕过 Framework 直接打开 Sensor。
  • 多用户隔离: 在支持多用户的设备上,不同用户的数据流必须使用不同的 CameraDevice 实例,禁止共享。
  • 物理安全: 对于可旋转/可拆卸 Camera,HAL 必须检测物理连接状态,在断开时立即停止数据流。

3.4.3 安全需求检查表

需求 ID 描述 验证方法
REQ-SEC-001 所有 Camera 数据流必须经过 TEE 加密 抓取总线数据,验证加密头
REQ-SEC-002 HAL 必须拒绝未授权进程的 open() 调用 使用 adb shell 模拟未授权调用
REQ-SEC-003 预览帧缓冲区必须在 100ms 内清零 内存 dump 检测残留数据
REQ-SEC-004 固件升级必须签名验证 注入未签名固件,验证拒绝

3.5 需求可追溯性矩阵(RTM)

为了确保每个需求都被实现和测试,必须建立 需求可追溯性矩阵。RTM 将 SRS 中的需求 ID 映射到设计文档、代码模块和测试用例。

需求可追溯性矩阵(RTM)示例 SRS 需求 ID 设计模块 代码文件 测试用例 REQ-PERF-001 ISP 流水线 isp_pipeline.cpp TC-PERF-001 REQ-SEC-002 访问控制模块 access_control.cpp TC-SEC-002 RTM 确保每个需求都被实现(代码)和验证(测试),避免遗漏

3.6 本章小结

  • SRS 是项目基线,必须包含功能、接口、性能、安全四大维度,每个需求有唯一 ID。
  • 接口需求 优先选择 AIDL(Android 13+),利用 Binder 的高性能和统一生态。
  • 性能需求 必须分解到子模块(延迟预算)和不同工作模式(功耗预算),并附带测量条件。
  • 安全需求 覆盖数据加密、访问控制和物理安全,通过 RTM 确保可追溯。
  • 下一阶段将基于 SRS 进行 架构设计,将需求转化为具体的模块划分和组件交互。