Nexus 10 camera.release висит на 30 секунд
Мы группа разработчиков, которые работают над приложением для обработки видео в реальном времени для Android. Недавно клиент сообщил о зависании нашего приложения, которое происходит только на устройстве Nexus 10. Мы сами купили устройство и протестировали:
- устройство поставляется с предустановленным Android 4.2 - в нашем приложении не было зависаний и зависаний
- после обновления Android до 4.3 наше приложение зависло при закрытии камеры (объяснение см. ниже)
- при обновлении до 4.4 наше приложение продолжало зависать
- перепрошив заводской образ Android 5.0 Nexus 10, наше приложение все еще зависало
- (редактировать) - проблема была решена путем обновления Nexus 10 до Android 5.1
Больше информации о заморозке:
Наше приложение открывает камеру в методе действия onResume, устанавливает обратный вызов предварительного просмотра, устанавливает размер предварительного просмотра на максимально возможный для наших потребностей обработки (на nexus 10 это 1920x1080) и либо запускает предварительный просмотр (если возобновляет работу из спящего режима), либо делегирует то же самое к SurfaceCreated метод обратного вызова SurfaceView. В методе onPause наше приложение удаляет обратный вызов предварительного просмотра, останавливает предварительный просмотр камеры и освобождает камеру. Однако наше расследование показало, что camera.release
метод иногда занимает 30 секунд. В эти 30 секунд наше приложение было заморожено, потому что мы использовали для управления камерой из потока пользовательского интерфейса. Позже мы переместили управление камерой в отдельный поток обработчика событий и теперь camera.release
висит эта нить. Хотя теперь это невидимо для пользователя (пользовательский интерфейс не заблокирован), пользователь не может использовать камеру из какого-либо приложения, пока наш фоновый поток не удастся освободить камеру (т.е. через 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
Вы можете увидеть минимальный пример, который вызывает это поведение здесь - активность камеры должна быть перезапущена быстро несколько раз, чтобы увеличить вероятность входа в это состояние. Мы заметили, что это происходит гораздо чаще в нашем приложении, чем в примере приложения. Наше приложение выполняет некоторую сложную обработку кадров, также использует графический процессор для обработки изображений и, кроме того, камера также использует акселерометр и датчик ориентации - все они не включены в пример приложения.
Мы также видели пару оставшихся без ответа вопросов Stackru об этой же проблеме ( вопрос 1 и вопрос 2). Не могли бы вы объяснить, какой путь к кодам приведет к указанным выводам журнала и как избежать входа в это состояние?
До сих пор мы не встречали упоминание о зависании камеры ни на одном другом устройстве.
1 ответ
К сожалению, вы столкнулись с недетерминированной ошибкой в Nexus 10 camera HAL.
Хотя мы неоднократно пытались отследить эту проблему, мы, очевидно, не нашли здесь всех случаев проблем.
Что касается обходных путей, вы можете попробовать просто закрыть устройство камеры, не удаляя обратный вызов и не останавливая предварительный просмотр; не должно быть необходимости делать выключение поэтапно.