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