Wir sind eine Gruppe von Entwicklern, die auf einer Echtzeit-Videoverarbeitung App für Android arbeiten. Kürzlich hat ein Kunde in unserer App ein Einfrieren gemeldet, das nur auf Nexus 10 Geräten auftritt. Wir kauften das Gerät selbst und getestet:Nexus 10 camera.release hängt für 30 Sekunden
- Gerät mit Android kam 4.2 vorinstalliert - es gab keine hängt noch gefriert in unserer App
- nach Android 4.3 aktualisieren, unsere App auf Schließen Kamera vereisen (Erläuterung siehe unten)
- von 4,4 aktualisieren, unsere App gehalten
- durch blinken der neuesten Android 5.0 Nexus 10 Fabrik Bild einfrieren, unsere App gehalten noch Einfrieren
- (edit) - das Problem Nexus gelöst wurde 10 bis Android durch ein Upgrade 5.1
Weitere Informationen über das Einfrieren:
Unsere App die Kamera in onResume Methode der Aktivität öffnet, installiert die Vorschau Rückruf, legt die Vorschaugröße auf bestmögliche für unsere Verarbeitungsanforderungen (auf dem Nexus 10 ist das 1920x1080) und startet entweder die Vorschau (wenn aus dem Ruhezustand fortgesetzt wird) oder delegiert dieselbe an die SurfaceCreated-Methode des SurfaceView-Callbacks. In der onPause-Methode entfernt unsere App den Vorschau-Callback, stoppt die Kameravorschau und gibt die Kamera frei. Unsere Untersuchung hat jedoch gezeigt, dass die Methode camera.release
manchmal 30 Sekunden dauert. In diesen 30 Sekunden war unsere App eingefroren, weil wir die Kamera über den UI-Thread gesteuert haben. Später haben wir die Kamera-Steuerung in einen separaten Event-Handler-Thread verschoben und nun hängt camera.release
diesen Thread. Obwohl dies jetzt für den Benutzer unsichtbar ist (die Benutzeroberfläche ist nicht blockiert), kann der Benutzer die Kamera von keiner App aus verwenden, bis es unserem Hintergrund-Thread gelingt, die Kamera freizugeben (d. H. 30 Sekunden nachdem camera.release
aufgerufen wurde).
Während der Hang Zeit beobachteten wir die folgenden Logausgaben von Kameraservice:
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
Sie können die minimale Beispiel sehen, die dieses Verhalten auslöst here - Kamera Aktivität schnell einige Male neu gestartet werden muss die Chance zu erhöhen, in diesen Zustand einzutreten. Wir haben festgestellt, dass es in unserer App viel häufiger vorkommt als in der Beispiel-App. Unsere App macht einige schwere Frame-Verarbeitung, verwendet auch GPU für die Bildverarbeitung und neben der Kamera auch Beschleunigungsmesser und Orientierungssensor - all diese sind nicht in Beispiel-App enthalten.
Wir haben auch ein paar unbeantwortete StackOverflow Fragen über das gleiche Problem (question 1 und question 2) gesehen. Könnten Sie bitte erklären, welcher Codepfad zu den erwähnten Log-Ausgaben führt und wie Sie diesen Zustand vermeiden können?
Wir haben die erwähnten Kamera freeze auf einem anderen Gerät bisher nicht begegnen.
Ich habe versucht, einfach das Kamera-Gerät zu lösen, ohne den Rückruf zu entfernen und Vorschau zu stoppen, aber es dauerte noch 30 Sekunden, um die Kamera freizugeben. Wir werden nun versuchen, unseren Kamera-Management-Code mit der Camera2-API zu implementieren, hoffentlich wird dies nicht zum Absturz führen ... – DoDo
Wir haben ein paar Probleme in der L-Version auf dem N10 behoben, also hoffentlich sehen Sie, dass dies auch besser ist in L oder einem der folgenden Updates. –
Gestern erhielt unser N10 Android 5.0.2 Update, das Problem ist jedoch noch nicht behoben. Irgendeine Idee, in welcher Version diese Reparatur ankommen sollte? – DoDo