android android-ndk screenshot gpu framebuffer

Android lee fb0 siempre dame blackscreen



android-ndk screenshot (1)

A medida que el hardware avanza, es cada vez menos probable que encuentre un framebuffer real con el contenido de la pantalla.

Como se señala en los comentarios, adb usa el comando "screencap", que contacta a Surfaceflinger a través de una llamada Binder, /dev/graphcs/fb0 si eso falla. El último camino rara vez se usa ahora.

Si realmente quieres profundizar en cómo funciona esto, necesitas examinar cómo SurfaceFlinger hace la composición, especialmente el hwcomposer HAL. El compositor de hardware toma múltiples superficies gralloc y las compone durante el escaneo. Cómo funciona esto difiere de un dispositivo a otro; la implementación de hwcomposer generalmente la realiza el fabricante del chip gráfico.

La generación de capturas de pantalla, utilizada por el marco de la aplicación para generar las miniaturas para la función de "aplicaciones recientes", aplica los mismos pasos de composición que HWC pero exclusivamente con GLES. A partir de Android 4.2, el compositor de hardware no puede componer en un búfer.

Algunas veces el compositor de hardware "patea", por ejemplo, porque hay más capas de composite de las que el hardware puede manejar. En ese caso, SurfaceFlinger vuelve a la composición GLES, y habrá un buffer en algún lugar que tenga la imagen completa; si lo vas a encontrar abriendo /dev/graphics/fb0 es una cuestión diferente.

Algunos puntos de partida:

Mi dispositivo es Nexus 4 con Jelly Bean 4.2. Estoy tratando de grabar la pantalla y enviarla. La mayoría de los códigos en Internet hacen el límite leyendo / dev / graphics / fb0. Funciona bien en algunos dispositivos y en los sistemas anteriores. Pero cuando lo pruebo en mi dispositivo, falla. Solo me da pantalla negra y todo el "0" en los datos brutos. He ejecutado "adb root" para obtener el permiso de root, intenté "chmod 777 fb0", "cat fb0> / sdcard / fb0". También probé códigos como "mmap" y "memcpy" para obtener los datos. Pero todos fallan He buscado en internet y parece que no hay solución. Y algunos hilos dijeron que el kernel puede prohibirte leer el fb0. Alguien tiene idea sobre eso?