我的设备是运行Jelly Bean 4.2的Nexus 4。我正在尝试录制屏幕并将其发送出去。互联网上的大多数代码通过读取/ dev / graphics / fb0来执行上限。它在某些设备和旧系统中运行良好。但是当我在我的设备上试用它时,它会失败。它只给我黑屏和原始数据中的所有“0”。我运行“adb root”获取root权限,尝试“chmod 777 fb0”,“cat fb0> / sdcard / fb0”。我也试过像“mmap”和“memcpy”这样的代码来获取数据。但都失败了。我在互联网上搜索,似乎没有解决方案。有些线程说内核可能会禁止你读取fb0。有人有这个想法吗?
答案 0 :(得分:5)
随着硬件的发展,你越来越不可能找到包含屏幕内容的实际帧缓冲。
如评论中所述,adb使用“screencap”命令,该命令通过Binder调用与surfaceflinger联系,如果失败则返回/dev/graphcs/fb0
。后一条路现在很少使用。
如果你真的想深入了解它是如何工作的,你需要检查surfaceflinger如何组合,尤其是hwcomposer HAL。硬件编写器采用多个gralloc表面并在扫描期间将它们合成。这种工作原理因设备而异; hwcomposer实现通常由图形芯片制造商完成。
应用程序框架用于生成“最近应用程序”功能缩略图的屏幕截图生成应用了HWC所做的相同组合步骤,但仅适用于GLES。从Android 4.2开始,硬件编写器无法合成缓冲区。
有时硬件作曲家“踢”,例如因为要复合的层数多于硬件可以处理的层数。在这种情况下,surfaceflinger将恢复为GLES组合,并且将有一个缓冲区某处具有完整的图像;是否通过打开/dev/graphics/fb0
找到它是另一回事。
一些起点:
adb shell dumpsys SurfaceFlinger