2. HAL进程生命周期:CameraProvider进程的启动、绑定、死亡通知机制
Camera HAL 运行在独立的 CameraProvider 进程中,与 Framework 的相机服务(cameraserver)通过 HIDL / AIDL 通信。理解该进程的完整生命周期——从启动、绑定到死亡通知——是定位 HAL 闪退、服务重启、预览黑屏等问题的前提。
核心要点: CameraProvider 进程的异常退出会触发死亡通知,导致 cameraserver 重建连接;若重建失败或 HAL 状态未正确清理,则直接引发上层应用闪退。
2.1 进程启动流程
CameraProvider 进程由 init 启动,通过 .rc 文件定义服务属性。典型的启动路径如下:
- init 解析 .rc 文件:系统启动时,init 进程读取
android.hardware.camera.provider@2.x-service.rc,启动对应的可执行文件。 - HAL 服务注册:可执行文件调用
defaultPassthroughServiceImplementation()或手动注册ICameraProvider服务到 hwservicemanager。 - cameraserver 发现服务:cameraserver 通过
hwservicemanager::getService()获取 CameraProvider 的 Binder 代理。 - 服务就绪回调:cameraserver 注册死亡通知回调,并调用
setCallback()建立双向通信。
调试提示: 使用
adb shell dumpsys media.camera 可查看当前 CameraProvider 进程的 PID 和绑定状态;若显示 "not connected",说明进程未启动或已死亡。
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 服务本身异常(罕见但致命)。
• 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 服务,若失败则上报错误给上层应用。
2.4 死亡通知后的重建流程
当 cameraserver 收到死亡通知后,会执行以下重建步骤:
- 清理旧状态:释放已打开的 CameraDevice 会话,标记所有流为无效状态。
- 尝试重新获取服务:循环调用
hwservicemanager::getService(),最多重试 5 次,间隔 1 秒。 - 重新注册回调:若获取成功,重新调用
linkToDeath()和setCallback()。 - 通知上层:若重建失败,通过
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 进程保持存活,便于调试。生产环境务必移除该属性。