我的设备是运行Jelly Bean 4.2的Nexus 4。我正在尝试记录屏幕并将其发送出去。互联网上的大多数代码都通过读取/ dev / graphics / fb0来实现上限。它在某些设备和较旧的系统中运行良好。但是,当我在设备上尝试时,它会失败。它只给我黑屏,原始数据全为“ 0”。我已经运行“ adb root”来获得root权限,尝试了“ chmod 777 fb0”,“ cat fb0> / sdcard / fb0”。我也尝试过像“ mmap”和“ memcpy”这样的代码来获取数据。但是一切都失败了。我在互联网上搜索过,似乎没有解决办法。一些线程说内核可能禁止您读取fb0。有人对此有想法吗?

最佳答案

随着硬件的进步,找到带有屏幕内容的实际帧缓冲区的可能性越来越小。

如注释中所述,adb使用“ screencap”命令,该命令通过Binder调用与surfaceflinger进行联系,如果失败,则退回到/dev/graphcs/fb0。后一种路径现在很少使用。

如果您真的想深入了解它是如何工作的,则需要检查surfaceflinger如何进行合成,尤其是hwcomposer HAL。硬件编辑器采用多个gralloc表面,并在扫描期间将其合成。各个设备的工作方式各不相同; hwcomposer的实现通常由图形芯片制造商完成。

应用程序框架用来生成“最近的应用程序”功能的缩略图的屏幕截图生成,应用了HWC相同的构图步骤,但仅与GLES一起使用。从Android 4.2开始,硬件编辑器无法合并到缓冲区中。

有时,硬件作曲家会“点”,例如因为要复合的层比硬件处理的层还多。在这种情况下,surfaceflinger将恢复为GLES合成,并且在某个具有完整图像的位置将存在一个缓冲区。是否通过打开/dev/graphics/fb0找到它是另一回事。

一些起点:


surfaceflinger
hwcomposer HAL interface
adb shell dumpsys SurfaceFlinger

关于android - Android读取fb0总是给我黑屏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53579272/

10-10 16:05