我的设备是Nexus4运行果冻豆4.2。我正在试着录下屏幕并发送出去。互联网上的大多数代码都是通过读取/dev/graphics/fb0来实现的。它在一些设备和旧系统中运行良好。但当我在我的设备上尝试时,它失败了。它只给我黑屏和原始数据中的所有“0”。我已运行“adb root”以获取根权限,尝试了“chmod 777 fb0”、“cat fb0>/sdcard/fb0”。我也试过“mmap”和“memcpy”这样的代码来获取数据。但都失败了。我在网上搜索过,似乎没有解决办法。一些线程说内核可能禁止您读取fb0。有人知道吗? 最佳答案 随着硬件的发展,您越来越不可能找到包含屏幕内容的实际帧缓冲区。如评论中所述,adb使用“screencap”命令,该命令通过活页夹调用与surfaceflinger联系,如果失败,则返回/dev/graphcs/fb0。后者现在很少使用。如果你真的想深入了解它是如何工作的,你需要检查surfaceflinger是如何作曲的,尤其是hwcomposer哈尔。硬件生成器获取多个Gralloc曲面,并在扫描期间合成它们。这种工作方式因设备而异;硬件编写器的实现通常由图形芯片制造商完成。应用程序框架用于生成“最近的应用程序”功能的缩略图的屏幕快照生成应用了与hwc相同的合成步骤,但仅适用于gles。从android 4.2开始,硬件编写器无法合成缓冲区。有时硬件编写器“punts”,例如,因为要组合的层比硬件可以处理的多。在这种情况下,surfaceflinger返回到gles composition,并且在某个具有完整图像的地方会有一个缓冲区;打开/dev/graphics/fb0是否能找到它是另一回事。一些起点:surfaceflingerhwcomposer HAL interface 10-06 06:52