2. HAL进程生命周期:CameraProvider进程的启动、绑定、死亡通知机制

Camera HAL 运行在独立的 CameraProvider 进程中,与 Framework 的相机服务(cameraserver)通过 HIDL / AIDL 通信。理解该进程的完整生命周期——从启动、绑定到死亡通知——是定位 HAL 闪退、服务重启、预览黑屏等问题的前提。

核心要点: CameraProvider 进程的异常退出会触发死亡通知,导致 cameraserver 重建连接;若重建失败或 HAL 状态未正确清理,则直接引发上层应用闪退。

2.1 进程启动流程

CameraProvider 进程由 init 启动,通过 .rc 文件定义服务属性。典型的启动路径如下:

  1. init 解析 .rc 文件:系统启动时,init 进程读取 android.hardware.camera.provider@2.x-service.rc,启动对应的可执行文件。
  2. HAL 服务注册:可执行文件调用 defaultPassthroughServiceImplementation() 或手动注册 ICameraProvider 服务到 hwservicemanager。
  3. cameraserver 发现服务:cameraserver 通过 hwservicemanager::getService() 获取 CameraProvider 的 Binder 代理。
  4. 服务就绪回调:cameraserver 注册死亡通知回调,并调用 setCallback() 建立双向通信。
调试提示: 使用 adb shell dumpsys media.camera 可查看当前 CameraProvider 进程的 PID 和绑定状态;若显示 "not connected",说明进程未启动或已死亡。
CameraProvider 进程启动流程图 init 解析 .rc HAL 服务注册 cameraserver 发现 服务就绪 关键文件:android.hardware.camera.provider@2.x-service.rc 注册函数:defaultPassthroughServiceImplementation() 或 registerAsService() 死亡通知回调注册(关键步骤)

2.2 进程绑定机制

绑定过程涉及 hwservicemanager 和 Binder 驱动,核心步骤包括:

步骤 角色 动作 关键函数/接口
1 CameraProvider 向 hwservicemanager 注册服务 registerAsService()
2 cameraserver 通过服务名获取代理 hwservicemanager::getService()
3 cameraserver 注册死亡通知回调 linkToDeath()
4 CameraProvider 返回 ICameraProvider 接口 onGetService()
5 cameraserver 调用 setCallback() 建立双向通道 ICameraProviderCallback
常见绑定失败原因:
• SELinux 策略阻止了 cameraserver 访问 CameraProvider 的 Binder 节点。
• CameraProvider 进程启动后立即崩溃,导致服务名未注册成功。
• hwservicemanager 服务本身异常(罕见但致命)。

2.3 死亡通知机制

死亡通知是 HAL 进程异常退出时,Framework 侧获得通知的唯一可靠途径。其工作原理如下:

  • 注册回调:cameraserver 在获取 CameraProvider 代理后,立即调用 binder::linkToDeath() 注册死亡通知。
  • Binder 驱动监控:当 CameraProvider 进程的 Binder 线程池终止或进程被 kill 时,Binder 驱动检测到节点失效。
  • 回调触发:Binder 驱动向 cameraserver 发送 BR_DEAD_BINDER 消息,触发已注册的死亡回调函数。
  • 服务重建:cameraserver 在死亡回调中尝试重新获取 CameraProvider 服务,若失败则上报错误给上层应用。
死亡通知机制时序图 CameraProvider Binder 驱动 cameraserver linkToDeath() 进程崩溃/SIGKILL 检测 Binder 节点失效 BR_DEAD_BINDER 死亡回调执行

2.4 死亡通知后的重建流程

当 cameraserver 收到死亡通知后,会执行以下重建步骤:

  1. 清理旧状态:释放已打开的 CameraDevice 会话,标记所有流为无效状态。
  2. 尝试重新获取服务:循环调用 hwservicemanager::getService(),最多重试 5 次,间隔 1 秒。
  3. 重新注册回调:若获取成功,重新调用 linkToDeath() 和 setCallback()。
  4. 通知上层:若重建失败,通过 CameraService::onCameraProviderDied() 向上层应用发送错误回调。
Log 分析关键点:
• 搜索 CameraProvider has died 或 onCameraProviderDied 确认死亡事件发生。
• 搜索 getService returned 确认重建是否成功。
• 若出现 Failed to get CameraProvider service,说明 init 未重启进程或重启后注册失败。

2.5 进程死亡常见原因与 Log 特征

死亡原因 Log 特征 典型场景
空指针访问 FATAL EXCEPTION + signal 11 (SIGSEGV) HAL 内部未检查 nullptr
内存越界 signal 6 (SIGABRT) + malloc(): corrupted Gralloc 缓冲区溢出
死锁超时 Watchdog timed out + kill pid HAL 内部 mutex 死锁
SELinux 拒绝 avc: denied + kill 权限策略限制
OOM Killer lowmemorykiller + kill 内存压力过大
实战建议: 在开发阶段,通过 adb shell setprop persist.vendor.camera.provider.ready 1 可强制 CameraProvider 进程保持存活,便于调试。生产环境务必移除该属性。