2013-06-25 6 views
5

Mein Gerät ist Nexus 4 mit Jelly Bean 4.2. Ich versuche, den Bildschirm aufzunehmen und zu senden. Die meisten Codes im Internet machen die Kappe durch Lesen/dev/graphics/fb0. Es funktioniert gut in einigen Geräten und älteren Systemen. Aber wenn ich es auf meinem Gerät versuche, scheitert es. Es gibt mir nur Blackscreen und alle "0" in den Rohdaten. Ich habe "adb root" ausgeführt, um die root-Berechtigung zu erhalten, habe "chmod 777 fb0", "cat fb0>/sdcard/fb0" versucht. Ich habe auch Codes wie "mmap" und "memcpy" versucht, um die Daten zu bekommen. Aber alle scheitern. Ich habe im Internet gesucht und es scheint keine Lösung zu geben. Und einige Threads sagten, dass der Kernel das Lesen von fb0 verbieten könnte. Hat jemand eine Idee dazu?Android lesen fb0 geben Sie mir immer Blackscreen

+1

Mit modernem GPUs, die Framebuffer wahrscheinlich einfach nicht trivialer zugänglich sind (zumindest nicht in seiner Gesamtheit) zu die Haupt-CPU die meiste Zeit. Die meisten Implementationen von ADBD sind vor langer Zeit dazu übergegangen, eine externe, für ein Gerät spezifische ausführbare Datei zu verwenden, die so etwas wie screencap genannt wird, um die eigentliche Arbeit zum Erfassen des Framebuffers zu erledigen. Sie können dies entweder verwenden, versuchen, eine Dokumentation/Quelle zu finden, oder versuchen, die ausführbare Datei zurückzuentwickeln. Normalerweise würde ich "viel Glück" auf der Quelle sagen, aber für ein Nexus-Gerät könnte es tatsächlich verfügbar sein (oder sie können nur die Binärdatei zusammen mit den anderen geschlossenen Bits bereitstellen) –

+1

Danke für die Antwort. Eigentlich enthält der Originalcode von Android zwei ausführbare Dateien: screencap und screenshot. Und es gibt zwei Wege in ihren Codes. Einer ist durch Lesen der fb0, ein anderer ist durch Aufruf von glPixel() von der nativen Android-Bibliothek bereitgestellt. Der zweite ist ziemlich langsam. Eigentlich habe ich eine mit der zweiten Methode implementiert, aber die fps ist nicht ideal. Also gehe ich zurück und versuche es auf die erste Art und Weise. In meinem Projekt gibt es keine Einschränkungen. Ich kann sogar den Kernel hacken, um es zu implementieren. Seit Wochen an dem Problem festhalten. Brauche Hilfe. – user1659072

+0

Was Sie brauchen, ist Low-Level-GPU-Programmierinformationen, die leider nicht von den Herstellern freigegeben wird. Ich glaube nicht, dass sie das einfache fb aufgegeben haben, das als schwierig oder sogar zur Sicherheit gelesen wurde; Sie taten es, weil die Hardware das ganze Ding nicht mehr einfach (oder zumindest portabel) als einen zusammenhängenden Puffer aussetzte.Nach dieser Änderung habe ich noch einmal eine andere Implementierung durchgespielt, die den echten Framebuffer in Chunks liest, der mit etwas Low-Level-Code interagiert - effizienter als der pixelweise Ansatz, aber wiederum einzigartig für spezifische Hardware. –

Antwort

5

Mit fortschreitender Hardware wird es immer seltener möglich, einen tatsächlichen Framebuffer mit den darin enthaltenen Bildschirminhalten zu finden.

Wie in den Kommentaren erwähnt, verwendet adb den "screencap" -Befehl, der über einen Binder-Aufruf mit surfaceflinger in Verbindung tritt und auf /dev/graphcs/fb0 zurückfällt, falls das fehlschlägt. Der letzte Pfad wird jetzt selten verwendet.

Wenn Sie wirklich wissen wollen, wie das funktioniert, müssen Sie untersuchen, wie Surfingflinger Zusammensetzung, vor allem die HWcomposer HAL. Der Hardware-Composer nimmt mehrere Gralloc-Oberflächen und fügt sie während des Scan-Out zusammen. Wie das funktioniert, ist von Gerät zu Gerät unterschiedlich; Die hwcomposer-Implementierung wird normalerweise vom Hersteller des Grafikchips durchgeführt.

Screenshot-Generierung, die vom App-Framework zum Generieren der Miniaturansichten für die Funktion "Letzte Apps" verwendet wird, wendet die gleichen Kompositionsschritte an, die HWC jedoch ausschließlich mit GLES durchführt. Ab Android 4.2 ist der Hardware-Composer nicht in der Lage, einen Puffer zu bilden.

Manchmal der Hardware-Composer "Punts", z. weil es mehr Layer zu Composite gibt, als die Hardware verarbeiten kann. In diesem Fall kehrt SurfaceFlinger zur GLES-Komposition zurück, und dort wird ein Puffer irgendwo sein, der das vollständige Bild hat; Ob Sie es finden, indem Sie /dev/graphics/fb0 öffnen, ist eine andere Sache.

Einige Ansatzpunkte:

Verwandte Themen