我们是一群正在开发 Android 实时视频处理应用程序的开发人员。最近,一位客户报告我们的应用程序出现冻结,这种情况仅发生在 Nexus 10 设备上。我们自己购买了设备并进行了测试:
- 设备预装了 Android 4.2 - 我们的应用程序没有挂起或冻结
- 将 Android 升级到 4.3 后,我们的应用程序在关闭相机时冻结(请参阅下面的说明)
- 升级到 4.4 后,我们的应用程序一直冻结
- 通过刷新最新的 Android 5.0 Nexus 10 工厂映像,我们的应用程序仍然冻结
- (编辑)- 通过将 Nexus 10 升级到 Android 5.1 解决了该问题
有关冻结的更多信息:
我们的应用程序在 Activity 的 onResume 方法中打开相机,安装预览回调,将预览尺寸设置为最适合我们的处理需求(在 Nexus 10 上为 1920x1080),然后启动预览(如果从睡眠状态恢复)或委托相同的预览到SurfaceView回调的surfaceCreated方法。在 onPause 方法中,我们的应用程序删除预览回调,停止相机预览并释放相机。然而,我们的调查表明camera.release
方法有时需要 30 秒才能完成。在那 30 秒内,我们的应用程序被冻结,因为我们过去常常从 UI 线程控制相机。后来我们将相机控件移至单独的事件处理程序线程,现在camera.release
挂起该线程。虽然现在这对用户来说是不可见的(UI 没有被阻止),但用户无法从任何应用程序使用相机,直到我们的后台线程成功释放相机(即 30 秒后)camera.release
被称为)。
在挂起期间,我们观察到摄像机服务的以下日志输出:
10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:14.453: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:14.453: E/Camera2-StreamingProcessor(122): deletePreviewStream: Error waiting for preview to drain: Connection timed out (-110)
10-21 16:09:24.573: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:24.573: E/Camera2-CallbackProcessor(122): deleteStream: Error waiting for HAL to drain: Connection timed out (-110)
10-21 16:09:24.578: E/libexynosv4l2(122): failed to ioctl: VIDIOC_REQBUFS (-1 - Invalid argument)
10-21 16:09:24.578: E/ExynosCameraHAL2(122): cam_int_reqbufs: VIDIOC_REQBUFS (fd:35) failed (-1)
10-21 16:09:24.843: E/Camera2-CallbackProcessor(122): deleteStream: Camera 0: Device does not exist
10-21 16:09:24.853: E/Camera2-StreamingProcessor(122): deletePreviewStream: Camera 0: Device does not exist
您可以看到触发此行为的最小示例here https://www.dropbox.com/s/qtx3hx41c9xwi1i/MyApplication.zip?dl=0- 相机活动需要快速重新启动几次,以增加进入此状态的机会。我们注意到它在我们的应用程序中比在示例应用程序中出现的频率要高得多。我们的应用程序进行一些重帧处理,还使用 GPU 进行图像处理,此外相机还使用加速计和方向传感器 - 所有这些都不包含在示例应用程序中。
我们还看到了一些关于同一问题的未解答的 StackOverflow 问题(问题1 https://stackoverflow.com/questions/21324390/camera-release-takes-30-seconds-to-release-the-camera-in-nexus-10-is-there-an and 问题2 https://stackoverflow.com/questions/8783091/app-hanging-on-camera-release)。您能否解释一下什么代码路径将导致提到的日志输出以及如何避免进入该状态?
到目前为止,我们还没有在任何其他设备上遇到提到的相机冻结问题。